MantisBase v0.3.7
Loading...
Searching...
No Matches
logger.h
Go to the documentation of this file.
1
8#ifndef MB_LOGGER_H
9#define MB_LOGGER_H
10
11#include <iostream>
12#include <nlohmann/json.hpp>
13#include <spdlog/spdlog.h>
14#include <spdlog/sinks/basic_file_sink.h>
15#include <memory>
16
17#include "log_database.h"
18#include "../../utils/utils.h"
19
20namespace mb {
21 using json = nlohmann::json;
22
23 // Forward declaration
24 class LogDatabase;
25
29 typedef enum class LogLevel : uint8_t {
30 TRACE = 0,
31 DEBUG,
32 INFO,
33 WARN,
36
41 class Logger {
42 std::unique_ptr<LogDatabase> m_logsDb;
43
44 public:
45 Logger();
46 ~Logger() { std::cout << "Logger Des()" << std::endl; }
47
48 inline static std::atomic<bool> isDbInitialized = false;
49
50 static void setLogLevel(const LogLevel &level = LogLevel::INFO);
51
56 [[nodiscard]] LogDatabase &logsDb() const;
57
61 static void initDb(const std::string &data_dir = "");
62
63 // Logging methods with structured format:
64 // - origin: Component/system origin (System, Auth, Database, Entity, EntitySchema, etc.)
65 // - message: Short message (e.g., "Auth Failed", "Database Connected")
66 // - details: Long description of the message
67 // - data: Optional JSON object/array with additional data
68 static void trace(const std::string &origin,
69 const std::string &message,
70 const std::string &details = "",
71 const json &data = json::object());
72
73 static void info(const std::string &origin,
74 const std::string &message,
75 const std::string &details = "",
76 const json &data = json::object());
77
78 static void debug(const std::string &origin,
79 const std::string &message,
80 const std::string &details = "",
81 const json &data = json::object());
82
83 static void warn(const std::string &origin,
84 const std::string &message,
85 const std::string &details = "",
86 const json &data = json::object());
87
88 static void critical(const std::string &origin,
89 const std::string &message,
90 const std::string &details = "",
91 const json &data = json::object());
92
93 private:
94 template<typename... Args>
95 static void trace_spdlog(fmt::format_string<Args...> msg, Args &&... args) {
96 spdlog::trace(msg, std::forward<Args>(args)...);
97 }
98
99 template<typename... Args>
100 static void info_spdlog(fmt::format_string<Args...> msg, Args &&... args) {
101 spdlog::info(msg, std::forward<Args>(args)...);
102 }
103
104 template<typename... Args>
105 static void debug_spdlog(fmt::format_string<Args...> msg, Args &&... args) {
106 spdlog::debug(msg, std::forward<Args>(args)...);
107 }
108
109 template<typename... Args>
110 static void warn_spdlog(fmt::format_string<Args...> msg, Args &&... args) {
111 spdlog::warn(msg, std::forward<Args>(args)...);
112 }
113
114 template<typename... Args>
115 static void critical_spdlog(fmt::format_string<Args...> msg, Args &&... args) {
116 spdlog::critical(msg, std::forward<Args>(args)...);
117 }
118
119 static void logToDatabase(const std::string &level,
120 const std::string &origin,
121 const std::string &message,
122 const std::string &details,
123 const json &data = json::object());
124 };
125
126 namespace logEntry {
127 // System logging
128 inline void trace(const std::string &origin,
129 const std::string &message,
130 const std::string &details = "",
131 const json &data = json::object()) {
132 Logger::trace(origin, message, details, data);
133 }
134
135 inline void info(const std::string &origin,
136 const std::string &message,
137 const std::string &details = "",
138 const json &data = json::object()) {
139 Logger::info(origin, message, details, data);
140 }
141
142 inline void debug(const std::string &origin,
143 const std::string &message,
144 const std::string &details = "",
145 const json &data = json::object()) {
146 Logger::debug(origin, message, details, data);
147 }
148
149 inline void warn(const std::string &origin,
150 const std::string &message,
151 const std::string &details = "",
152 const json &data = json::object()) {
153 Logger::warn(origin, message, details, data);
154 }
155
156 inline void critical(const std::string &origin,
157 const std::string &message,
158 const std::string &details = "",
159 const json &data = json::object()) {
160 Logger::critical(origin, message, details, data);
161 }
162 }
163
168 namespace LogOrigin {
169 // System logging
170 inline void trace(const std::string &message,
171 const std::string &details = "",
172 const json &data = json::object()) {
173 Logger::trace("System", message, details, data);
174 }
175
176 inline void info(const std::string &message,
177 const std::string &details = "",
178 const json &data = json::object()) {
179 Logger::info("System", message, details, data);
180 }
181
182 inline void debug(const std::string &message,
183 const std::string &details = "",
184 const json &data = json::object()) {
185 Logger::debug("System", message, details, data);
186 }
187
188 inline void warn(const std::string &message,
189 const std::string &details = "",
190 const json &data = json::object()) {
191 Logger::warn("System", message, details, data);
192 }
193
194 inline void critical(const std::string &message,
195 const std::string &details = "",
196 const json &data = json::object()) {
197 Logger::critical("System", message, details, data);
198 }
199
200 // Auth logging
201 inline void authTrace(const std::string &message,
202 const std::string &details = "",
203 const json &data = json::object()) {
204 Logger::trace("Auth", message, details, data);
205 }
206
207 inline void authInfo(const std::string &message,
208 const std::string &details = "",
209 const json &data = json::object()) {
210 Logger::info("Auth", message, details, data);
211 }
212
213 inline void authDebug(const std::string &message,
214 const std::string &details = "",
215 const json &data = json::object()) {
216 Logger::debug("Auth", message, details, data);
217 }
218
219 inline void authWarn(const std::string &message,
220 const std::string &details = "",
221 const json &data = json::object()) {
222 Logger::warn("Auth", message, details, data);
223 }
224
225 inline void authCritical(const std::string &message,
226 const std::string &details = "",
227 const json &data = json::object()) {
228 Logger::critical("Auth", message, details, data);
229 }
230
231 // Database logging
232 inline void dbTrace(const std::string &message,
233 const std::string &details = "",
234 const json &data = json::object()) {
235 Logger::trace("Database", message, details, data);
236 }
237
238 inline void dbInfo(const std::string &message,
239 const std::string &details = "",
240 const json &data = json::object()) {
241 Logger::info("Database", message, details, data);
242 }
243
244 inline void dbDebug(const std::string &message,
245 const std::string &details = "",
246 const json &data = json::object()) {
247 Logger::debug("Database", message, details, data);
248 }
249
250 inline void dbWarn(const std::string &message,
251 const std::string &details = "",
252 const json &data = json::object()) {
253 Logger::warn("Database", message, details, data);
254 }
255
256 inline void dbCritical(const std::string &message,
257 const std::string &details = "",
258 const json &data = json::object()) {
259 Logger::critical("Database", message, details, data);
260 }
261
262 // Entity logging
263 inline void entityTrace(const std::string &message,
264 const std::string &details = "",
265 const json &data = json::object()) {
266 Logger::trace("Entity", message, details, data);
267 }
268
269 inline void entityInfo(const std::string &message,
270 const std::string &details = "",
271 const json &data = json::object()) {
272 Logger::info("Entity", message, details, data);
273 }
274
275 inline void entityDebug(const std::string &message,
276 const std::string &details = "",
277 const json &data = json::object()) {
278 Logger::debug("Entity", message, details, data);
279 }
280
281 inline void entityWarn(const std::string &message,
282 const std::string &details = "",
283 const json &data = json::object()) {
284 Logger::warn("Entity", message, details, data);
285 }
286
287 inline void entityCritical(const std::string &message,
288 const std::string &details = "",
289 const json &data = json::object()) {
290 Logger::critical("Entity", message, details, data);
291 }
292
293 // EntitySchema logging
294 inline void entitySchemaTrace(const std::string &message,
295 const std::string &details = "",
296 const json &data = json::object()) {
297 Logger::trace("EntitySchema", message, details, data);
298 }
299
300 inline void entitySchemaInfo(const std::string &message,
301 const std::string &details = "",
302 const json &data = json::object()) {
303 Logger::info("EntitySchema", message, details, data);
304 }
305
306 inline void entitySchemaDebug(const std::string &message,
307 const std::string &details = "",
308 const json &data = json::object()) {
309 Logger::debug("EntitySchema", message, details, data);
310 }
311
312 inline void entitySchemaWarn(const std::string &message,
313 const std::string &details = "",
314 const json &data = json::object()) {
315 Logger::warn("EntitySchema", message, details, data);
316 }
317
318 inline void entitySchemaCritical(const std::string &message,
319 const std::string &details = "",
320 const json &data = json::object()) {
321 Logger::critical("EntitySchema", message, details, data);
322 }
323 }
324
330 public:
331 explicit FuncLogger(std::string msg);
332
333 ~FuncLogger();
334
335 private:
336 std::string m_msg;
337 };
338}
339
340// Macro to automatically insert logger with function name
341inline std::string getFile(const std::string &path) {
342 const std::filesystem::path p = path;
343 return p.filename().string();
344}
345
346#define MB_FUNC() std::format("{} - {}()", getFile(__FILE__), __FUNCTION__)
347#define TRACE_FUNC(x) mb::FuncLogger _logger(x);
348#define TRACE_MB_FUNC() try{ mb::FuncLogger _logger(MB_FUNC()); } catch(...){}
349#define TRACE_CLASS_METHOD() mb::FuncLogger _logger(std::format("{} {}::{}()", getFile(__FILE__), "", __FUNCTION__));
350#define TRACE_METHOD() mb::FuncLogger _logger(std::format("{} {}()", getFile(__FILE__), __FUNCTION__));
351
352#endif // MB_LOGGER_H
A class for tracing function execution [entry, exit] useful in following execution flow.
Definition logger.h:329
~FuncLogger()
Definition logger.cpp:183
Manages SQLite database for application logs.
Definition log_database.h:33
Definition logger.h:41
static void debug(const std::string &origin, const std::string &message, const std::string &details="", const json &data=json::object())
Definition logger.cpp:116
Logger()
Definition logger.cpp:40
static void trace(const std::string &origin, const std::string &message, const std::string &details="", const json &data=json::object())
Definition logger.cpp:73
static void info(const std::string &origin, const std::string &message, const std::string &details="", const json &data=json::object())
Definition logger.cpp:94
static void critical(const std::string &origin, const std::string &message, const std::string &details="", const json &data=json::object())
Definition logger.cpp:158
~Logger()
Definition logger.h:46
static std::atomic< bool > isDbInitialized
Definition logger.h:48
LogDatabase & logsDb() const
Get the log database instance (for API access).
Definition logger.cpp:54
static void setLogLevel(const LogLevel &level=LogLevel::INFO)
Definition logger.cpp:10
static void warn(const std::string &origin, const std::string &message, const std::string &details="", const json &data=json::object())
Definition logger.cpp:137
static void initDb(const std::string &data_dir="")
Initialize database connection.
Definition logger.cpp:58
SQLite database manager for application logs.
std::string getFile(const std::string &path)
Definition logger.h:341
router.h
Definition auth.h:16
LogLevel
Definition logger.h:29
@ WARN
‍Info Logging Level
@ INFO
‍Debug Logging Level
@ CRITICAL
‍Warning Logging Level
@ DEBUG
‍Trace logging level
nlohmann::json json
Shorten JSON namespace.
Definition context_store.h:18