10#ifndef M5_UTILITY_LOG_LIBRARY_LOG_HPP
11#define M5_UTILITY_LOG_LIBRARY_LOG_HPP
32using log_level_t = LogLevel;
35constexpr log_level_t logOutputLevel = log_level_t::None;
36#elif defined(M5_LOG_LEVEL)
37constexpr log_level_t logOutputLevel =
static_cast<log_level_t
>(M5_LOG_LEVEL);
38#elif defined(CORE_DEBUG_LEVEL)
39constexpr log_level_t logOutputLevel =
static_cast<log_level_t
>(CORE_DEBUG_LEVEL);
54constexpr bool contains_slash(
const char* s)
56 return *s ? (*s ==
'/' ? true : contains_slash(s + 1)) :
false;
59constexpr const char* after_right_slash(
const char* s)
61 return (*s ==
'/') ? (s + 1) : after_right_slash(s - 1);
64constexpr const char* tail(
const char* s)
66 return *s ? tail(s + 1) : s;
77 return (path && path[0]) ? (contains_slash(path) ? after_right_slash(tail(path)) : path) :
"";
81void logPrintf(
const char* format, ...);
83void dump(
const void* addr,
const size_t len,
const bool align =
true);
85using elapsed_time_t = std::chrono::milliseconds;
89elapsed_time_t elapsedTime();
92#ifndef M5_UTILITY_LOG_FORMAT
93#define M5_UTILITY_LOG_FORMAT(letter, format) \
94 "[%6lld][" #letter "][%s:%u] %s(): " format "\n", (int64_t)m5::utility::log::elapsedTime().count(), \
95 m5::utility::log::pathToFilename(__FILE__), __LINE__, __func__
103#define M5_LIB_LOGE(format, ...) \
105 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Error) { \
106 m5::utility::log::logPrintf(M5_UTILITY_LOG_FORMAT(E, format), ##__VA_ARGS__); \
113#define M5_LIB_LOGW(format, ...) \
115 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Warn) { \
116 m5::utility::log::logPrintf(M5_UTILITY_LOG_FORMAT(W, format), ##__VA_ARGS__); \
123#define M5_LIB_LOGI(format, ...) \
125 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Info) { \
126 m5::utility::log::logPrintf(M5_UTILITY_LOG_FORMAT(I, format), ##__VA_ARGS__); \
133#define M5_LIB_LOGD(format, ...) \
135 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Debug) { \
136 m5::utility::log::logPrintf(M5_UTILITY_LOG_FORMAT(D, format), ##__VA_ARGS__); \
143#define M5_LIB_LOGV(format, ...) \
145 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Verbose) { \
146 m5::utility::log::logPrintf(M5_UTILITY_LOG_FORMAT(V, format), ##__VA_ARGS__); \
154#define M5_DUMPE(addr, len) \
156 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Error) { \
157 m5::utility::log::dump((addr), (len)); \
164#define M5_DUMPW(addr, len) \
166 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Warn) { \
167 m5::utility::log::dump((addr), (len)); \
174#define M5_DUMPI(addr, len) \
176 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Info) { \
177 m5::utility::log::dump((addr), (len)); \
184#define M5_DUMPD(addr, len) \
186 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Debug) { \
187 m5::utility::log::dump((addr), (len)); \
194#define M5_DUMPV(addr, len) \
196 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Verbose) { \
197 m5::utility::log::dump((addr), (len)); \
LogLevel
Log output control level.
Definition library_log.hpp:24
constexpr log_level_t logOutputLevel
Base value of log level to be output.
Definition library_log.hpp:49
constexpr const char * pathToFilename(const char *path)
Gets the filename from full pathname.
Definition library_log.hpp:75
Top level namespace of M5.
Definition base64.cpp:39