1.定义service
//src\webserver_run.cpp
int 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返回的单例对象中