Consolix
Loading...
Searching...
No Matches
LoggerComponent.hpp
Go to the documentation of this file.
1#pragma once
2#ifndef _CONSOLIX_LOGGER_COMPONENT_HPP_INCLUDED
3#define _CONSOLIX_LOGGER_COMPONENT_HPP_INCLUDED
4
8
9#if CONSOLIX_USE_LOGIT == 1
10
13#ifndef CONSOLIX_BASE_PATH
14#define CONSOLIX_BASE_PATH {}
15#endif
16
17#ifndef LOGIT_BASE_PATH
18#define LOGIT_BASE_PATH CONSOLIX_BASE_PATH
19#endif
20
23#define CONSOLIX_LOGIT_CONSOLE_INDEX 0
24
27#define CONSOLIX_LOGIT_LOGO_INDEX 1
28
31#define CONSOLIX_LOGIT_DEBUG_INDEX 2
32
35#define CONSOLIX_LOGIT_LOGGER_INDEX 3
36
39#define CONSOLIX_LOGIT_UNIQUE_FILE_INDEX 4
40
43#define CONSOLIX_STREAM() \
44 consolix::MultiStream( \
45 logit::LogLevel::LOG_LVL_TRACE, \
46 logit::make_relative(__FILE__, LOGIT_BASE_PATH), \
47 __LINE__, \
48 LOGIT_FUNCTION)
49
55#define CONSOLIX_LOG_STREAM(level) \
56 consolix::MultiStream( \
57 (level), \
58 logit::make_relative(__FILE__, LOGIT_BASE_PATH), \
59 __LINE__, \
60 LOGIT_FUNCTION, \
61 {})
62
67#define CONSOLIX_LOG_STREAM_EX(level, ...) \
68 consolix::MultiStream( \
69 (level), \
70 logit::make_relative(__FILE__, LOGIT_BASE_PATH), \
71 __LINE__, \
72 LOGIT_FUNCTION, \
73 {__VA_ARGS__})
74
77#define CONSOLIX_LOGO_STREAM() \
78 LOGIT_STREAM_TRACE_TO(CONSOLIX_LOGIT_LOGO_INDEX)
79
82#define CONSOLIX_UNIQUE_FILE_STREAM() \
83 LOGIT_STREAM_TRACE_TO(CONSOLIX_LOGIT_UNIQUE_FILE_INDEX)
84
87#define CONSOLIX_UNIQUE_FILE_NAME() \
88 LOGIT_GET_LAST_FILE_NAME(CONSOLIX_LOGIT_UNIQUE_FILE_INDEX)
89
92#ifndef CONSOLIX_CONSOLE_PATTERN
93#define CONSOLIX_CONSOLE_PATTERN LOGIT_CONSOLE_PATTERN
94#endif
95
98#ifndef CONSOLIX_CONSOLE_DEBUG_PATTERN
99#define CONSOLIX_CONSOLE_DEBUG_PATTERN "%H:%M:%S.%e | [%25!g:%#] [%l] %^%v%$"
100#endif
101
104#ifndef CONSOLIX_FILE_LOGGER_PATTERN
105#define CONSOLIX_FILE_LOGGER_PATTERN LOGIT_FILE_LOGGER_PATTERN
106#endif
107
110#ifndef CONSOLIX_FILE_LOGGER_PATH
111#define CONSOLIX_FILE_LOGGER_PATH LOGIT_FILE_LOGGER_PATH
112#endif
113
116#ifndef CONSOLIX_UNIQUE_FILE_LOGGER_PATH
117#define CONSOLIX_UNIQUE_FILE_LOGGER_PATH LOGIT_UNIQUE_FILE_LOGGER_PATH
118#endif
119
122#ifndef CONSOLIX_FILE_LOGGER_AUTO_DELETE_DAYS
123#define CONSOLIX_FILE_LOGGER_AUTO_DELETE_DAYS LOGIT_FILE_LOGGER_AUTO_DELETE_DAYS
124#endif
125
128#ifndef CONSOLIX_UNIQUE_FILE_LOGGER_HASH_LENGTH
129#define CONSOLIX_UNIQUE_FILE_LOGGER_HASH_LENGTH LOGIT_UNIQUE_FILE_LOGGER_HASH_LENGTH
130#endif
131
134#define CONSOLIX_SET_DEBUG_MODE(mode) \
135 LOGIT_SET_LOGGER_ENABLED(CONSOLIX_LOGIT_DEBUG_INDEX, mode)
136
137#include <logit.hpp>
139
140namespace consolix {
141
147 class LoggerComponent : public IAppComponent {
148 public:
149
156 const std::string& console_pattern = CONSOLIX_CONSOLE_PATTERN,
157 const std::string& console_debug_pattern = CONSOLIX_CONSOLE_DEBUG_PATTERN,
158 const std::string& file_pattern = CONSOLIX_FILE_LOGGER_PATTERN,
159 const int auto_delete_days = CONSOLIX_FILE_LOGGER_AUTO_DELETE_DAYS)
160 : m_debug_pattern(console_debug_pattern) {
161 init_logger(console_pattern, file_pattern, auto_delete_days);
162 }
163
165 virtual ~LoggerComponent() = default;
166
167 protected:
168
171 bool initialize() override {
172# if CONSOLIX_USE_CXXOPTS == 1
174 m_is_init = true;
175 return true;
176 }
177 if (!has_service<CliArguments>()) return false;
178 auto args = get_service<CliArguments>();
179 if (args.count("debug") || args.count("d")) {
180 CONSOLIX_SET_DEBUG_MODE(true);
181 }
182# endif
183 m_is_init = true;
184 return true;
185 }
186
189 bool is_initialized() const override {
190 return m_is_init;
191 }
192
194 void process() override {}
195
196 private:
197 std::string m_debug_pattern;
198 std::atomic<bool> m_is_init{false};
199
204 void init_logger(
205 const std::string& console_pattern,
206 const std::string& file_pattern,
207 int auto_delete_days) {
208 static bool is_once = false;
209 if (is_once) return;
210 is_once = true;
211
212 // Primary console backend with level-based routing:
213 // TRACE..WARN -> std::cout, ERROR..FATAL -> std::cerr.
214 // The config object's primary stream (std::cout by default) is only
215 // used as a fallback when no route matches; our routes cover all
216 // levels, so every record is dispatched by level.
217 logit::ConsoleLogger::Config console_cfg;
218 console_cfg.async = true;
219 console_cfg.routes.push_back(
220 logit::ConsoleStreamRoute::to_cout(
221 logit::LogLevel::LOG_LVL_TRACE,
222 logit::LogLevel::LOG_LVL_WARN));
223 console_cfg.routes.push_back(
224 logit::ConsoleStreamRoute::to_cerr(
225 logit::LogLevel::LOG_LVL_ERROR,
226 logit::LogLevel::LOG_LVL_FATAL));
227 LOGIT_ADD_CONSOLE_CONFIG(console_cfg, console_pattern);
228
229 LOGIT_ADD_CONSOLE_SINGLE_MODE("%^%v%$", true); // Logo log stream
230 LOGIT_ADD_CONSOLE(m_debug_pattern, true); // Debug log stream
231 CONSOLIX_SET_DEBUG_MODE(false);
232
233 // Файловый лорггер
234 LOGIT_ADD_FILE_LOGGER(
236 true,
237 auto_delete_days,
238 file_pattern);
239
240 // Файловый логгер для отедельных больших записей
241 LOGIT_ADD_UNIQUE_FILE_LOGGER_SINGLE_MODE(
243 true,
244 auto_delete_days,
246 "%v");
247 }
248 }; // LoggerComponent
249
250}; // namespace consolix
251
252#else // Fallback for when LogIt is not enabled
253
255
257#define CONSOLIX_STREAM() \
258 consolix::MultiStream()
259
262#define CONSOLIX_LOG_STREAM(level) \
263 consolix::MultiStream()
264
266#define CONSOLIX_LOG_STREAM_EX(level, ...) \
267 consolix::MultiStream()
268
270#define CONSOLIX_LOGO_STREAM() \
271 consolix::MultiStream(false)
272
273namespace consolix {
274
278 public:
279
280 LoggerComponent() = default;
281 virtual ~LoggerComponent() = default;
282
283 protected:
284
285 bool initialize() override {return true;}
286 bool is_initialized() const override {return true;}
287 void process() override {}
288
289 }; // LoggerComponent
290
291}; // namespace consolix
292
293#endif
294
295#endif // _CONSOLIX_LOGGER_COMPONENT_HPP_INCLUDED
MultiStream class for unified log output handling.
Interface for defining application components.
bool initialize() override
Initializes the component. This method is called once before the component is processed.
bool is_initialized() const override
Checks if the component is initialized. Used to verify if the component is ready to be executed.
void process() override
Executes the component's main logic. Called repeatedly during the application's main execution loop.
virtual ~LoggerComponent()=default
#define CONSOLIX_FILE_LOGGER_PATTERN
File log message pattern.
#define CONSOLIX_FILE_LOGGER_PATH
Default file logger path.
#define CONSOLIX_UNIQUE_FILE_LOGGER_PATH
Default unique file logger path.
#define CONSOLIX_UNIQUE_FILE_LOGGER_HASH_LENGTH
Default hash length for unique file names.
#define CONSOLIX_CONSOLE_PATTERN
Console log message pattern.
#define CONSOLIX_FILE_LOGGER_AUTO_DELETE_DAYS
Auto-delete log files older than the specified number of days.
#define CONSOLIX_CONSOLE_DEBUG_PATTERN
Debug console log message pattern.
< Utility modules and helpers.
T & get_service()
Retrieves a resource globally. Retrieves a reference to a globally registered resource from the Servi...
bool has_service()
Checks if a resource is registered globally.