2#ifndef _LOGIT_LOGGER_HPP_INCLUDED
3#define _LOGIT_LOGGER_HPP_INCLUDED
41 std::unique_ptr<ILogger> logger,
42 std::unique_ptr<ILogFormatter> formatter,
43 bool single_mode =
false) {
45 std::lock_guard<std::mutex> lock(
m_mutex);
59 std::lock_guard<std::mutex> lock(
m_mutex);
60 if (logger_index >= 0 && logger_index <
static_cast<int>(
m_loggers.size())) {
61 m_loggers[logger_index].enabled = enabled;
69 std::lock_guard<std::mutex> lock(
m_mutex);
70 if (logger_index >= 0 && logger_index <
static_cast<int>(
m_loggers.size())) {
81 std::lock_guard<std::mutex> lock(
m_mutex);
82 if (logger_index >= 0 && logger_index <
static_cast<int>(
m_loggers.size())) {
83 m_loggers[logger_index].single_mode = single_mode;
92 std::lock_guard<std::mutex> lock(
m_mutex);
93 if (logger_index >= 0 && logger_index <
static_cast<int>(
m_loggers.size())) {
94 m_loggers[logger_index].formatter->set_timestamp_offset(offset_ms);
102 std::lock_guard<std::mutex> lock(
m_mutex);
104 strategy.logger->set_log_level(level);
113 std::lock_guard<std::mutex> lock(
m_mutex);
114 if (logger_index >= 0 && logger_index <
static_cast<int>(
m_loggers.size())) {
115 m_loggers[logger_index].logger->set_log_level(level);
124 std::lock_guard<std::mutex> lock(
m_mutex);
125 if (logger_index >= 0 && logger_index <
static_cast<int>(
m_loggers.size())) {
126 return m_loggers[logger_index].single_mode;
138 std::lock_guard<std::mutex> lock(
m_mutex);
142 if (!strategy.enabled)
return;
143 if (
static_cast<int>(record.
log_level) <
static_cast<int>(strategy.logger->get_log_level()))
return;
144 strategy.logger->log(record, strategy.formatter->
format(record));
148 if (strategy.single_mode)
continue;
149 if (!strategy.enabled)
continue;
150 if (
static_cast<int>(record.
log_level) <
static_cast<int>(strategy.logger->get_log_level()))
continue;
151 strategy.logger->log(record, strategy.formatter->
format(record));
161 if (logger_index >= 0 && logger_index <
static_cast<int>(
m_loggers.size())) {
162 const auto& strategy =
m_loggers[logger_index];
163 return strategy.logger->get_string_param(param);
165 return std::string();
174 if (logger_index >= 0 && logger_index <
static_cast<int>(
m_loggers.size())) {
175 const auto& strategy =
m_loggers[logger_index];
176 return strategy.logger->get_int_param(param);
187 if (logger_index >= 0 && logger_index <
static_cast<int>(
m_loggers.size())) {
188 const auto& strategy =
m_loggers[logger_index];
189 return strategy.logger->get_float_param(param);
199 template <
typename... Ts>
201 this->
print(record, args...);
202 return std::forward_as_tuple(std::forward<Ts>(args)...);
212 template <
typename T>
214 this->
print(record, args);
215 return std::forward<decltype(args)>(args);
231 strategy.logger->wait();
266# pragma warning(push)
267# pragma warning(disable: 4127)
274 template <
typename... Ts>
276 if (
sizeof...(Ts) == 0) {
Defines the interface for loggers used in the logging system.
Defines the TaskExecutor class, which manages task execution in a separate thread.
auto log_and_return(const LogRecord &record) -> std::tuple<>
Logs message without arguments and returns empty tuple.
auto log_and_return(const LogRecord &record, T &&args) -> decltype(args)
Logs message and returns argument.
void set_logger_enabled(int logger_index, bool enabled)
Enables or disables a logger by index.
void wait()
Waits for all asynchronous loggers to finish processing.
void log(const LogRecord &record)
Logs a LogRecord using added loggers and formatters.
void set_logger_single_mode(int logger_index, bool single_mode)
Sets single-mode flag for a logger.
void set_timestamp_offset(int logger_index, int64_t offset_ms)
Sets timestamp offset for a specific logger.
void add_logger(std::unique_ptr< ILogger > logger, std::unique_ptr< ILogFormatter > formatter, bool single_mode=false)
Adds a logger and its corresponding formatter.
Logger & operator=(const Logger &)=delete
Logger(const Logger &)=delete
void shutdown()
Shuts down logger system.
void set_log_level(int logger_index, LogLevel level)
Sets minimal log level for a specific logger.
std::vector< LoggerStrategy > m_loggers
Container for logger-formatter pairs.
void set_log_level(LogLevel level)
Sets minimal log level for all loggers.
std::mutex m_mutex
Mutex for thread safety during logging operations.
void print(const LogRecord &record)
bool is_logger_single_mode(int logger_index) const
Checks whether a logger is in single mode.
std::atomic< bool > m_shutdown
Flag indicating if shutdown was requested.
double get_float_param(int logger_index, const LoggerParam ¶m) const
Retrieves a floating-point parameter from a logger.
std::string get_string_param(int logger_index, const LoggerParam ¶m) const
Retrieves a string parameter from a logger.
auto log_and_return(const LogRecord &record, Ts &&... args) -> decltype(std::forward_as_tuple(std::forward< Ts >(args)...))
Logs message and returns tuple of arguments.
int64_t get_int_param(int logger_index, const LoggerParam ¶m) const
Retrieves an integer parameter from a logger.
static void on_exit_handler()
Atexit shutdown handler for Logger and TaskExecutor.
bool is_logger_enabled(int logger_index) const
Checks if a logger is enabled.
static Logger & get_instance()
Retrieves singleton instance of Logger.
Logger & operator=(Logger &&)=delete
void print(const LogRecord &record, Ts const &... args)
Logs a record with given arguments.
void shutdown()
Shuts down the TaskExecutor by stopping the worker thread.
static TaskExecutor & get_instance()
Get the singleton instance of the TaskExecutor.
The primary namespace for the LogIt++ library.
std::vector< VariableValue > args_to_array(std::vector< std::string >::const_iterator)
Base case of recursion for argument conversion — when there are no more arguments.
std::vector< std::string > split_arguments(const std::string &all_names)
Splits a string of argument names into individual names, ignoring nested templates,...
LoggerParam
Enumeration for different logger parameters that can be retrieved.
Stores log metadata and content.
const int logger_index
Logger index (-1 to log to all).
const LogLevel log_level
Log level (severity).
const std::string format
Format string for the message.
std::vector< VariableValue > args_array
Argument values for the log.
const std::string arg_names
Argument names for the log.
Structure to hold a logger-formatter pair.
std::unique_ptr< ILogger > logger
The logger instance.
bool single_mode
Flag indicating if the logger is in single mode.
std::unique_ptr< ILogFormatter > formatter
The formatter instance.
bool enabled
Flag indicating if the logger is enabled.