summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--DEVELOPING.md6
-rw-r--r--config/bmcweb_config.h.in2
-rw-r--r--config/meson.build11
-rw-r--r--http/logging.hpp101
-rw-r--r--meson.build8
-rw-r--r--meson_options.txt8
-rw-r--r--src/webserver_main.cpp2
7 files changed, 81 insertions, 57 deletions
diff --git a/DEVELOPING.md b/DEVELOPING.md
index ae6b5c008f..5468f798e7 100644
--- a/DEVELOPING.md
+++ b/DEVELOPING.md
@@ -234,15 +234,15 @@ And their use cases:
### Enabling logging
bmcweb by default is compiled with runtime logging disabled, as a performance
-consideration. To enable it in a standalone build, add the
+consideration. To enable it in a standalone build, add the logging level
```ascii
--Dlogging='enabled'
+-Dlogging='debug'
```
option to your configure flags. If building within Yocto, add the following to
your local.conf.
```bash
-EXTRA_OEMESON:pn-bmcweb:append = "-Dbmcweb-logging='enabled'"
+EXTRA_OEMESON:pn-bmcweb:append = "-Dbmcweb-logging='debug'"
```
diff --git a/config/bmcweb_config.h.in b/config/bmcweb_config.h.in
index b0a3a7bf51..ae98675d3c 100644
--- a/config/bmcweb_config.h.in
+++ b/config/bmcweb_config.h.in
@@ -14,4 +14,6 @@ constexpr const size_t bmcwebHttpReqBodyLimitMb = @BMCWEB_HTTP_REQ_BODY_LIMIT_MB
constexpr const char* mesonInstallPrefix = "@MESON_INSTALL_PREFIX@";
constexpr const bool bmcwebInsecureEnableHttpPushStyleEventing = @BMCWEB_INSECURE_ENABLE_HTTP_PUSH_STYLE_EVENTING@ == 1;
+
+constexpr const char* bmcwebLoggingLevel = "@BMCWEB_LOGGING_LEVEL@";
// clang-format on
diff --git a/config/meson.build b/config/meson.build
index f42656b296..b13a023418 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -13,6 +13,14 @@ conf_data.set10('BMCWEB_INSECURE_ENABLE_HTTP_PUSH_STYLE_EVENTING', insecure_push
conf_data.set('MESON_INSTALL_PREFIX', get_option('prefix'))
conf_data.set('HTTPS_PORT', get_option('https_port'))
+# Logging level
+loglvlopt = get_option('bmcweb-logging')
+if get_option('buildtype').startswith('debug') and loglvlopt == 'disabled'
+ # Override logging level as 'debug' if 'bmcweb-logging' is set as 'dsiabled'
+ loglvlopt = 'debug'
+endif
+conf_data.set('BMCWEB_LOGGING_LEVEL', loglvlopt)
+
conf_h_dep = declare_dependency(
include_directories: include_directories('.'),
sources: configure_file(
@@ -41,4 +49,5 @@ configure_file(input : 'pam-webserver',
output : 'webserver',
copy : true,
install_dir: '/etc/pam.d',
- install : true) \ No newline at end of file
+ install : true)
+
diff --git a/http/logging.hpp b/http/logging.hpp
index 5f268f4913..6543b7306e 100644
--- a/http/logging.hpp
+++ b/http/logging.hpp
@@ -1,5 +1,9 @@
#pragma once
+#include "bmcweb_config.h"
+
+#include <algorithm>
+#include <array>
#include <cstdio>
#include <cstdlib>
#include <ctime>
@@ -7,18 +11,46 @@
#include <iostream>
#include <sstream>
#include <string>
+#include <string_view>
namespace crow
{
enum class LogLevel
{
- Debug = 0,
+ Disabled = 0,
+ Debug,
Info,
Warning,
Error,
Critical,
};
+// Mapping of the external loglvl name to internal loglvl
+constexpr std::array<std::pair<std::string_view, crow::LogLevel>, 7>
+ mapLogLevelFromName{{{"disabled", crow::LogLevel::Disabled},
+ {"enabled", crow::LogLevel::Debug},
+ {"debug", crow::LogLevel::Debug},
+ {"info", crow::LogLevel::Info},
+ {"warning", crow::LogLevel::Warning},
+ {"error", crow::LogLevel::Error},
+ {"critical", crow::LogLevel::Critical}}};
+
+constexpr crow::LogLevel getLogLevelFromName(std::string_view name)
+{
+ const auto* iter =
+ std::find_if(begin(mapLogLevelFromName), end(mapLogLevelFromName),
+ [&name](const auto& v) { return v.first == name; });
+ if (iter != end(mapLogLevelFromName))
+ {
+ return iter->second;
+ }
+ return crow::LogLevel::Disabled;
+}
+
+// configured bmcweb LogLevel
+constexpr crow::LogLevel bmcwebCurrentLoggingLevel =
+ getLogLevelFromName(bmcwebLoggingLevel);
+
class Logger
{
private:
@@ -42,24 +74,16 @@ class Logger
public:
Logger([[maybe_unused]] const std::string& prefix,
[[maybe_unused]] const std::string& filename,
- [[maybe_unused]] const size_t line, LogLevel levelIn) :
- level(levelIn)
+ [[maybe_unused]] const size_t line)
{
-#ifdef BMCWEB_ENABLE_LOGGING
stringstream << "(" << timestamp() << ") [" << prefix << " "
<< std::filesystem::path(filename).filename() << ":"
<< line << "] ";
-#endif
}
~Logger()
{
- if (level >= getCurrentLogLevel())
- {
-#ifdef BMCWEB_ENABLE_LOGGING
- stringstream << std::endl;
- std::cerr << stringstream.str();
-#endif
- }
+ stringstream << std::endl;
+ std::cerr << stringstream.str();
}
Logger(const Logger&) = delete;
@@ -71,41 +95,32 @@ class Logger
template <typename T>
Logger& operator<<([[maybe_unused]] T const& value)
{
- if (level >= getCurrentLogLevel())
- {
-#ifdef BMCWEB_ENABLE_LOGGING
- // Somewhere in the code we're implicitly casting an array to a
- // pointer in logging code. It's non-trivial to find, so disable
- // the check here for now
- // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
- stringstream << value;
-#endif
- }
+ // Somewhere in the code we're implicitly casting an array to a
+ // pointer in logging code. It's non-trivial to find,
+ // so disable the check here for now
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
+ stringstream << value;
return *this;
}
- //
- static void setLogLevel(LogLevel level)
+ constexpr static LogLevel getCurrentLogLevel()
{
- getLogLevelRef() = level;
+ return bmcwebCurrentLoggingLevel;
}
- static LogLevel getCurrentLogLevel()
+ constexpr static bool isLoggingEnabled()
{
- return getLogLevelRef();
+ return getCurrentLogLevel() >= crow::LogLevel::Debug;
}
- private:
- //
- static LogLevel& getLogLevelRef()
+ constexpr static bool checkLoggingLevel(const LogLevel level)
{
- static auto currentLevel = static_cast<LogLevel>(1);
- return currentLevel;
+ return isLoggingEnabled() && (getCurrentLogLevel() <= level);
}
+ private:
//
std::ostringstream stringstream;
- LogLevel level;
};
} // namespace crow
@@ -115,25 +130,25 @@ class Logger
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define BMCWEB_LOG_CRITICAL \
- if (crow::Logger::getCurrentLogLevel() <= crow::LogLevel::Critical) \
- crow::Logger("CRITICAL", __FILE__, __LINE__, crow::LogLevel::Critical)
+ if constexpr (crow::Logger::checkLoggingLevel(crow::LogLevel::Critical)) \
+ crow::Logger("CRITICAL", __FILE__, __LINE__)
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define BMCWEB_LOG_ERROR \
- if (crow::Logger::getCurrentLogLevel() <= crow::LogLevel::Error) \
- crow::Logger("ERROR", __FILE__, __LINE__, crow::LogLevel::Error)
+ if constexpr (crow::Logger::checkLoggingLevel(crow::LogLevel::Error)) \
+ crow::Logger("ERROR", __FILE__, __LINE__)
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define BMCWEB_LOG_WARNING \
- if (crow::Logger::getCurrentLogLevel() <= crow::LogLevel::Warning) \
- crow::Logger("WARNING", __FILE__, __LINE__, crow::LogLevel::Warning)
+ if constexpr (crow::Logger::checkLoggingLevel(crow::LogLevel::Warning)) \
+ crow::Logger("WARNING", __FILE__, __LINE__)
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define BMCWEB_LOG_INFO \
- if (crow::Logger::getCurrentLogLevel() <= crow::LogLevel::Info) \
- crow::Logger("INFO", __FILE__, __LINE__, crow::LogLevel::Info)
+ if constexpr (crow::Logger::checkLoggingLevel(crow::LogLevel::Info)) \
+ crow::Logger("INFO", __FILE__, __LINE__)
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define BMCWEB_LOG_DEBUG \
- if (crow::Logger::getCurrentLogLevel() <= crow::LogLevel::Debug) \
- crow::Logger("DEBUG", __FILE__, __LINE__, crow::LogLevel::Debug)
+ if constexpr (crow::Logger::checkLoggingLevel(crow::LogLevel::Debug)) \
+ crow::Logger("DEBUG", __FILE__, __LINE__)
diff --git a/meson.build b/meson.build
index cf4c658aa7..54055484c4 100644
--- a/meson.build
+++ b/meson.build
@@ -198,18 +198,14 @@ if (get_option('buildtype') != 'plain')
endif
endif
-if( get_option('bmcweb-logging').enabled() or \
+if( get_option('bmcweb-logging') != 'disabled' or \
get_option('buildtype').startswith('debug'))
add_project_arguments([
- '-DBMCWEB_ENABLE_LOGGING',
'-DBMCWEB_ENABLE_DEBUG'
],
language : 'cpp')
- summary({'debug' :'-DBMCWEB_ENABLE_DEBUG',
- 'logging' : '-DBMCWEB_ENABLE_LOGGING',
-
- },section : 'Enabled Features')
+ summary('debug', '-DBMCWEB_ENABLE_DEBUG', section : 'Enabled Features')
endif
# Set Compiler Security flags
diff --git a/meson_options.txt b/meson_options.txt
index 57fb8ce05e..0bf2c3507a 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -128,9 +128,13 @@ option(
option(
'bmcweb-logging',
- type: 'feature',
+ type: 'combo',
+ choices : [ 'disabled', 'enabled', 'debug', 'info', 'warning', 'error', 'critical' ],
value: 'disabled',
- description: 'Enable output the extended debug logs'
+ description: '''Enable output the extended logging level.
+ - disabled: disable bmcweb log traces.
+ - enabled: treated as 'debug'
+ - For the other logging level option, see DEVELOPING.md.'''
)
option(
diff --git a/src/webserver_main.cpp b/src/webserver_main.cpp
index b13ab270ec..a7f06b8e76 100644
--- a/src/webserver_main.cpp
+++ b/src/webserver_main.cpp
@@ -64,8 +64,6 @@ inline void setupSocket(crow::App& app)
static int run()
{
- crow::Logger::setLogLevel(crow::LogLevel::Debug);
-
auto io = std::make_shared<boost::asio::io_context>();
App app(io);