mitteLib
Loading...
Searching...
No Matches
log.hpp
Go to the documentation of this file.
1//
2// Created by spak on 03/09/24.
3//
4
5#ifndef LOG_HPP
6#define LOG_HPP
7
8#include <string_view>
9#include <vector>
10
11#ifdef ESP_PLATFORM
12
13#include <esp_log.h>
14
15namespace mlab {
16 enum struct log_level : int {
17 none = static_cast<int>(ESP_LOG_NONE),
18 error = static_cast<int>(ESP_LOG_ERROR),
19 warn = static_cast<int>(ESP_LOG_WARN),
20 info = static_cast<int>(ESP_LOG_INFO),
21 debug = static_cast<int>(ESP_LOG_DEBUG),
22 verbose = static_cast<int>(ESP_LOG_VERBOSE)
23 };
24}
25
26#define LOGE ESP_LOGE
27#define LOGW ESP_LOGW
28#define LOGI ESP_LOGI
29#define LOGD ESP_LOGD
30#define LOGV ESP_LOGV
31
32#define LOGE_BUFFER_HEX(tag, buffer, buff_len) ESP_LOG_BUFFER_HEX_LEVEL(tag, buffer, buff_len, ESP_LOG_ERROR)
33#define LOGW_BUFFER_HEX(tag, buffer, buff_len) ESP_LOG_BUFFER_HEX_LEVEL(tag, buffer, buff_len, ESP_LOG_WARN)
34#define LOGI_BUFFER_HEX(tag, buffer, buff_len) ESP_LOG_BUFFER_HEX_LEVEL(tag, buffer, buff_len, ESP_LOG_INFO)
35#define LOGD_BUFFER_HEX(tag, buffer, buff_len) ESP_LOG_BUFFER_HEX_LEVEL(tag, buffer, buff_len, ESP_LOG_DEBUG)
36#define LOGV_BUFFER_HEX(tag, buffer, buff_len) ESP_LOG_BUFFER_HEX_LEVEL(tag, buffer, buff_len, ESP_LOG_VERBOSE)
37
38#else
39
40#include <chrono>
41#include <cstdio>
42
43namespace mlab {
44 [[nodiscard]] std::uint32_t log_timestamp();
45
46 enum struct log_level : int {
47 none,
48 error,
49 warn,
50 info,
51 debug,
53 };
54
55 void log_buffer(const char *format, std::uint32_t timestamp, void const *buffer, std::size_t buffer_length);
56}// namespace mlab
57
58#define MLAB_LOG_COLOR_E "\033[0;31m"
59#define MLAB_LOG_COLOR_W "\033[0;33m"
60#define MLAB_LOG_COLOR_I "\033[0;32m"
61#define MLAB_LOG_COLOR_D
62#define MLAB_LOG_COLOR_V
63#define MLAB_LOG_RESET_COLOR "\033[0m"
64#define MLAB_LOG_FORMAT(letter, format) MLAB_LOG_COLOR_##letter #letter " (%u) %s: " format MLAB_LOG_RESET_COLOR "\n"
65
66#ifndef LOG_LOCAL_LEVEL
67#define LOG_LOCAL_LEVEL mlab::log_level::info
68#endif
69
70
71#define LOG_LEVEL(level, tag, format, letter, ...) \
72 do { \
73 if (static_cast<int>(LOG_LOCAL_LEVEL) >= static_cast<int>(level) and \
74 ::mlab::check_log_level(tag, static_cast<::mlab::log_level>(level))) \
75 std::printf((MLAB_LOG_FORMAT(letter, format)), ::mlab::log_timestamp(), tag, ##__VA_ARGS__); \
76 } while (false)
77
78#define LOGE(tag, format, ...) LOG_LEVEL(mlab::log_level::error, tag, format, E, ##__VA_ARGS__)
79#define LOGW(tag, format, ...) LOG_LEVEL(mlab::log_level::warn, tag, format, W, ##__VA_ARGS__)
80#define LOGI(tag, format, ...) LOG_LEVEL(mlab::log_level::info, tag, format, I, ##__VA_ARGS__)
81#define LOGD(tag, format, ...) LOG_LEVEL(mlab::log_level::debug, tag, format, D, ##__VA_ARGS__)
82#define LOGV(tag, format, ...) LOG_LEVEL(mlab::log_level::verbose, tag, format, V, ##__VA_ARGS__)
83
84#define LOG_BUFFER_HEX_LEVEL(level, letter, tag, buffer, buff_len) \
85 do { \
86 if (static_cast<int>(LOG_LOCAL_LEVEL) >= static_cast<int>(level) and \
87 ::mlab::check_log_level(tag, static_cast<::mlab::log_level>(level))) \
88 ::mlab::log_buffer(MLAB_LOG_FORMAT(letter, "%s"), buffer, buff_len, ::mlab::log_timestamp()); \
89 } while (false)
90
91#define LOGE_BUFFER_HEX(tag, buffer, buff_len) LOG_BUFFER_HEX_LEVEL(mlab::log_level::error, E, tag, buffer, buff_len)
92#define LOGW_BUFFER_HEX(tag, buffer, buff_len) LOG_BUFFER_HEX_LEVEL(mlab::log_level::warn, W, tag, buffer, buff_len)
93#define LOGI_BUFFER_HEX(tag, buffer, buff_len) LOG_BUFFER_HEX_LEVEL(mlab::log_level::info, I, tag, buffer, buff_len)
94#define LOGD_BUFFER_HEX(tag, buffer, buff_len) LOG_BUFFER_HEX_LEVEL(mlab::log_level::debug, D, tag, buffer, buff_len)
95#define LOGV_BUFFER_HEX(tag, buffer, buff_len) LOG_BUFFER_HEX_LEVEL(mlab::log_level::verbose, V, tag, buffer, buff_len)
96
97#endif
98
99namespace mlab {
100
101 void set_log_level(std::string_view tag, log_level level);
102 [[nodiscard]] log_level get_log_level(std::string_view tag);
103 [[nodiscard]] bool check_log_level(std::string_view tag, log_level level);
104
115 std::vector<std::pair<const char *, log_level>> tag_log_lev{};
116
121
125 bool is_suppressed = false;
126
130 suppress_log() = default;
131
136 suppress_log(std::initializer_list<const char *> tags);
137
143 suppress_log(log_level min_level, std::initializer_list<const char *> tags);
144
149 suppress_log(suppress_log const &) = delete;
150 suppress_log(suppress_log &&other) noexcept;
151
152 suppress_log &operator=(suppress_log const &other) = delete;
153 suppress_log &operator=(suppress_log &&other) noexcept;
161 void suppress();
162
166 void restore();
167
172 };
173
174 [[nodiscard]] constexpr std::strong_ordering operator<=>(log_level l, log_level r) {
175 return static_cast<int>(l) <=> static_cast<int>(r);
176 }
177}// namespace mlab
178#endif//LOG_HPP
Definition log.cpp:10
std::uint32_t log_timestamp()
Definition log.cpp:14
log_level get_log_level(std::string_view tag)
Definition log.cpp:67
bool check_log_level(std::string_view tag, log_level level)
Definition log.cpp:83
constexpr std::strong_ordering operator<=>(log_level l, log_level r)
Definition log.hpp:174
log_level
Definition log.hpp:46
void log_buffer(const char *format, std::uint32_t timestamp, void const *buffer, std::size_t buffer_length)
Definition log.cpp:17
void set_log_level(std::string_view tag, log_level level)
Definition log.cpp:75
A utility class to contextually enable/disable some of ESP32 log levels. This class is RAII,...
Definition log.hpp:111
bool is_suppressed
Definition log.hpp:125
suppress_log(suppress_log const &)=delete
void restore()
Definition log.cpp:116
~suppress_log()
Definition log.cpp:125
void suppress()
Definition log.cpp:107
std::vector< std::pair< const char *, log_level > > tag_log_lev
Definition log.hpp:115
log_level min_level
Definition log.hpp:120
suppress_log & operator=(suppress_log const &other)=delete
suppress_log()=default