1.定义service
//src\webserver_run.cppint run()
{...std::shared_ptr<sdbusplus::asio::connection> systemBus =std::make_shared<sdbusplus::asio::connection>(io);crow::connections::systemBus = systemBus.get();auto server = sdbusplus::asio::object_server(systemBus);std::shared_ptr<sdbusplus::asio::dbus_interface> iface =server.add_interface("/xyz/openbmc_project/bmcweb","xyz.openbmc_project.bmcweb");iface->register_method("SetLogLevel", setLogLevel);iface->initialize();...systemBus->request_name("xyz.openbmc_project.bmcweb");...
}
为BmcWeb定义了
Service:xyz.openbmc_project.bmcweb
ObjPath:/xyz/openbmc_project/bmcweb
Interface:xyz.openbmc_project.bmcweb
Method:SetLogLevel
2.设置日志级别
//http\logging.hpp
constexpr std::array<std::string_view, 7> mapLogLevelFromName{"DISABLED", "CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG", "ENABLED"};constexpr crow::LogLevel getLogLevelFromName(std::string_view name)
{const auto* iter = std::ranges::find(mapLogLevelFromName, name);if (iter != mapLogLevelFromName.end()){return static_cast<LogLevel>(iter - mapLogLevelFromName.begin());}return crow::LogLevel::Disabled;
}enum class LogLevel
{Disabled = 0,Critical,Error,Warning,Info,Debug,Enabled,
};inline crow::LogLevel& getBmcwebCurrentLoggingLevel()
{static crow::LogLevel level = getLogLevelFromName(BMCWEB_LOGGING_LEVEL);return level;
}
//src\webserver_run.cpp
static void setLogLevel(const std::string& logLevel)
{const std::basic_string_view<char>* iter =std::ranges::find(crow::mapLogLevelFromName, logLevel);if (iter == crow::mapLogLevelFromName.end()){BMCWEB_LOG_ERROR("log-level {} not found", logLevel);return;}crow::getBmcwebCurrentLoggingLevel() = crow::getLogLevelFromName(logLevel);BMCWEB_LOG_INFO("Requested log-level change to: {}", logLevel);
}
BmcWeb被实现为一个service,目的只有一个就是设置日志级别
而日志级别被保存在函数getBmcwebCurrentLoggingLevel返回的单例对象中