IRSOL
C++ code implementing socket server for interacting with Baumer camera.
Logging

Logging macros, types, and functions for the irsol library. More...

Files

file  logging.hpp
 Logging utilities and configuration for the irsol library.
 

Classes

struct  irsol::internal::LoggerInfo
 Metadata for a named logger instance. More...
 
class  irsol::internal::NamedLoggerRegistry
 Manages a registry of named loggers. More...
 

Macros

#define IRSOL_LOG_TRACE(...)   SPDLOG_TRACE(__VA_ARGS__)
 Logs a trace-level message using the default logger.
 
#define IRSOL_LOG_DEBUG(...)   SPDLOG_DEBUG(__VA_ARGS__)
 Logs a debug-level message using the default logger.
 
#define IRSOL_LOG_INFO(...)   SPDLOG_INFO(__VA_ARGS__)
 Logs an info-level message using the default logger.
 
#define IRSOL_LOG_WARN(...)   SPDLOG_WARN(__VA_ARGS__)
 Logs a warning-level message using the default logger.
 
#define IRSOL_LOG_ERROR(...)   SPDLOG_ERROR(__VA_ARGS__)
 Logs an error-level message using the default logger.
 
#define IRSOL_LOG_FATAL(...)   SPDLOG_CRITICAL(__VA_ARGS__)
 Logs a fatal (critical) message using the default logger.
 
#define IRSOL_NAMED_LOG_TRACE(name, ...)    irsol::internal::NamedLoggerRegistry::getLogger(name)->trace(__VA_ARGS__)
 Logs a trace-level message using a named logger.
 
#define IRSOL_NAMED_LOG_DEBUG(name, ...)    irsol::internal::NamedLoggerRegistry::getLogger(name)->debug(__VA_ARGS__)
 Logs a debug-level message using a named logger.
 
#define IRSOL_NAMED_LOG_INFO(name, ...)    irsol::internal::NamedLoggerRegistry::getLogger(name)->info(__VA_ARGS__)
 Logs an info-level message using a named logger.
 
#define IRSOL_NAMED_LOG_WARN(name, ...)    irsol::internal::NamedLoggerRegistry::getLogger(name)->warn(__VA_ARGS__)
 Logs a warning-level message using a named logger.
 
#define IRSOL_NAMED_LOG_ERROR(name, ...)    irsol::internal::NamedLoggerRegistry::getLogger(name)->error(__VA_ARGS__)
 Logs an error-level message using a named logger.
 
#define IRSOL_NAMED_LOG_FATAL(name, ...)    irsol::internal::NamedLoggerRegistry::getLogger(name)->critical(__VA_ARGS__)
 Logs a fatal (critical) message using a named logger.
 

Enumerations

enum class  irsol::LoggingFormat { irsol::LoggingFormat::CONSOLE , irsol::LoggingFormat::FILE , irsol::LoggingFormat::UNIT_TESTS }
 Enum representing supported logging output formats. More...
 

Functions

void irsol::setLoggingFormat (LoggingFormat format=LoggingFormat::FILE, std::optional< std::shared_ptr< spdlog::logger > > logger=std::nullopt)
 Sets the global logging format.
 
void irsol::setSinkLoggingFormat (LoggingFormat format, std::shared_ptr< spdlog::sinks::sink > sink)
 Sets the logging format for a specific sink.
 
void irsol::setLoggerName (const char *name)
 Sets the name of the default logger.
 
void irsol::initLogging (const char *fileSinkFilename="logs/irsol.log", std::optional< spdlog::level::level_enum > minLogLevel=std::nullopt)
 Initializes the irsol logging system.
 

Variables

const std::unordered_map< std::string, spdlog::level::level_enum > irsol::levelNameToLevelMap
 Runtime map from string names to spdlog log levels.
 

Detailed Description

Logging macros, types, and functions for the irsol library.

This group contains macros and helper utilities to log messages with different severity levels, configure logger output formats, and handle named loggers.

Macro Definition Documentation

◆ IRSOL_LOG_DEBUG

#define IRSOL_LOG_DEBUG (   ...)    SPDLOG_DEBUG(__VA_ARGS__)

Logs a debug-level message using the default logger.

Definition at line 91 of file logging.hpp.

◆ IRSOL_LOG_ERROR

#define IRSOL_LOG_ERROR (   ...)    SPDLOG_ERROR(__VA_ARGS__)

Logs an error-level message using the default logger.

Definition at line 94 of file logging.hpp.

◆ IRSOL_LOG_FATAL

#define IRSOL_LOG_FATAL (   ...)    SPDLOG_CRITICAL(__VA_ARGS__)

Logs a fatal (critical) message using the default logger.

Definition at line 95 of file logging.hpp.

◆ IRSOL_LOG_INFO

#define IRSOL_LOG_INFO (   ...)    SPDLOG_INFO(__VA_ARGS__)

Logs an info-level message using the default logger.

Definition at line 92 of file logging.hpp.

◆ IRSOL_LOG_TRACE

#define IRSOL_LOG_TRACE (   ...)    SPDLOG_TRACE(__VA_ARGS__)

Logs a trace-level message using the default logger.

Definition at line 90 of file logging.hpp.

◆ IRSOL_LOG_WARN

#define IRSOL_LOG_WARN (   ...)    SPDLOG_WARN(__VA_ARGS__)

Logs a warning-level message using the default logger.

Definition at line 93 of file logging.hpp.

◆ IRSOL_NAMED_LOG_DEBUG

#define IRSOL_NAMED_LOG_DEBUG (   name,
  ... 
)     irsol::internal::NamedLoggerRegistry::getLogger(name)->debug(__VA_ARGS__)

Logs a debug-level message using a named logger.

Definition at line 174 of file logging.hpp.

185 {
186
191enum class LoggingFormat
192{
193 CONSOLE,
194 FILE,
196};
197
209 LoggingFormat format = LoggingFormat::FILE,
210 std::optional<std::shared_ptr<spdlog::logger>> logger = std::nullopt);
211
221void setSinkLoggingFormat(LoggingFormat format, std::shared_ptr<spdlog::sinks::sink> sink);
222
232void setLoggerName(const char* name);
233
244void initLogging(
245 const char* fileSinkFilename = "logs/irsol.log",
246 std::optional<spdlog::level::level_enum> minLogLevel = std::nullopt);
247
254inline const std::unordered_map<std::string, spdlog::level::level_enum> levelNameToLevelMap = {
255#ifdef DEBUG
256 {"trace", spdlog::level::trace},
257 {"debug", spdlog::level::debug},
258#endif
259 {"info", spdlog::level::info},
260 {"warn", spdlog::level::warn},
261 {"error", spdlog::level::err}};
262} // namespace irsol
LoggingFormat
Enum representing supported logging output formats.
Definition logging.hpp:192
void setSinkLoggingFormat(LoggingFormat format, std::shared_ptr< spdlog::sinks::sink > sink)
Sets the logging format for a specific sink.
Definition logging.cpp:92
void setLoggerName(const char *name)
Sets the name of the default logger.
Definition logging.cpp:77
void initLogging(const char *fileSinkFilename="logs/irsol.log", std::optional< spdlog::level::level_enum > minLogLevel=std::nullopt)
Initializes the irsol logging system.
Definition logging.cpp:108
void setLoggingFormat(LoggingFormat format=LoggingFormat::FILE, std::optional< std::shared_ptr< spdlog::logger > > logger=std::nullopt)
Sets the global logging format.
Definition logging.cpp:84
const std::unordered_map< std::string, spdlog::level::level_enum > levelNameToLevelMap
Runtime map from string names to spdlog log levels.
Definition logging.hpp:254
@ CONSOLE
Human-readable format for terminal output.
@ UNIT_TESTS
Format suitable for unit test frameworks.
@ FILE
Persistent file logging format.

◆ IRSOL_NAMED_LOG_ERROR

#define IRSOL_NAMED_LOG_ERROR (   name,
  ... 
)     irsol::internal::NamedLoggerRegistry::getLogger(name)->error(__VA_ARGS__)

Logs an error-level message using a named logger.

Definition at line 180 of file logging.hpp.

◆ IRSOL_NAMED_LOG_FATAL

#define IRSOL_NAMED_LOG_FATAL (   name,
  ... 
)     irsol::internal::NamedLoggerRegistry::getLogger(name)->critical(__VA_ARGS__)

Logs a fatal (critical) message using a named logger.

Definition at line 182 of file logging.hpp.

◆ IRSOL_NAMED_LOG_INFO

#define IRSOL_NAMED_LOG_INFO (   name,
  ... 
)     irsol::internal::NamedLoggerRegistry::getLogger(name)->info(__VA_ARGS__)

Logs an info-level message using a named logger.

Definition at line 176 of file logging.hpp.

◆ IRSOL_NAMED_LOG_TRACE

#define IRSOL_NAMED_LOG_TRACE (   name,
  ... 
)     irsol::internal::NamedLoggerRegistry::getLogger(name)->trace(__VA_ARGS__)

Logs a trace-level message using a named logger.

Definition at line 172 of file logging.hpp.

◆ IRSOL_NAMED_LOG_WARN

#define IRSOL_NAMED_LOG_WARN (   name,
  ... 
)     irsol::internal::NamedLoggerRegistry::getLogger(name)->warn(__VA_ARGS__)

Logs a warning-level message using a named logger.

Definition at line 178 of file logging.hpp.

Enumeration Type Documentation

◆ LoggingFormat

enum class irsol::LoggingFormat
strongprivate

Enum representing supported logging output formats.

Enumerator
CONSOLE 

Human-readable format for terminal output.

FILE 

Persistent file logging format.

UNIT_TESTS 

Format suitable for unit test frameworks.

Definition at line 191 of file logging.hpp.

192{
193 CONSOLE,
194 FILE,
196};

Function Documentation

◆ initLogging()

void irsol::initLogging ( const char *  fileSinkFilename = "logs/irsol.log",
std::optional< spdlog::level::level_enum >  minLogLevel = std::nullopt 
)
private

Initializes the irsol logging system.

Creates and configures the global logger instance. This should typically be called once at application startup.

Parameters
fileSinkFilenamePath to the log file where logs are written to.
minLogLevelOptional minimum log level to use at runtime.

Definition at line 108 of file logging.cpp.

109{
110#ifdef DEBUG
111 // Set the logging level to debug if in debug mode
112 const auto defaultConsoleLevel = spdlog::level::trace;
113 const auto defaultFileSinkLevel = spdlog::level::trace;
114#else
115 // Set the logging level to info if not in debug mode
116 const auto defaultConsoleLevel = spdlog::level::info;
117 const auto defaultFileSinkLevel = spdlog::level::info;
118#endif
119
120 auto consoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
121 setSinkLoggingFormat(LoggingFormat::CONSOLE, consoleSink);
122
123 const auto maxFileSize = 1024 * 1024 * 5; // 5 MB
124 const auto maxFiles = 24; // Keep 24 rotated files
125 auto fileSink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(
126 logFilePath, maxFileSize, maxFiles, false);
127 setSinkLoggingFormat(LoggingFormat::FILE, fileSink);
128
129 // Set the loggers as default loggers
130 auto logger =
131 std::make_shared<spdlog::logger>("irsol", spdlog::sinks_init_list{consoleSink, fileSink});
132 spdlog::set_default_logger(logger);
133
134#ifdef DEBUG
135 // Force flush on trace level and above
136 spdlog::flush_on(spdlog::level::trace);
137#else
138 // Force flush on error level and above
139 spdlog::flush_on(spdlog::level::err);
140#endif
141
142 // Force flush every N seconds
143 spdlog::flush_every(std::chrono::seconds(2));
144
145 // Configure the levels for logging on the different sinks
146 auto consoleLevel = defaultConsoleLevel;
147 auto fileSinkLevel = defaultFileSinkLevel;
148 if(minLogLevel.has_value()) {
149 // Override the console and file levels if needed
150 consoleLevel = std::max({defaultConsoleLevel, *minLogLevel});
151 fileSinkLevel = std::max({defaultFileSinkLevel, *minLogLevel});
152 }
153 auto globalLevel = std::min({consoleLevel, fileSinkLevel});
154
155 consoleSink->set_level(consoleLevel);
156 fileSink->set_level(fileSinkLevel);
157 logger->set_level(globalLevel);
158
159#ifdef DEBUG
160 spdlog::info("Logging initialized with sync levels");
161 spdlog::info("Console {}", spdlog::level::to_string_view(consoleLevel));
162 spdlog::info("File: {}", spdlog::level::to_string_view(fileSinkLevel));
163 if(minLogLevel.has_value()) {
164 spdlog::info("Global: {} (overridden)", spdlog::level::to_string_view(minLogLevel.value()));
165 } else {
166 spdlog::info("Global: {}", spdlog::level::to_string_view(globalLevel));
167 }
168#endif
169}

◆ setLoggerName()

void irsol::setLoggerName ( const char *  name)
private

Sets the name of the default logger.

Use this to label logs with a custom identifier. Useful for distinguishing between multiple libraries or subsystems.

Parameters
nameThe desired logger name.

Definition at line 77 of file logging.cpp.

78{
79 auto logger = spdlog::default_logger()->clone(name);
80 spdlog::set_default_logger(logger);
81}

◆ setLoggingFormat()

void irsol::setLoggingFormat ( LoggingFormat  format = LoggingFormat::FILE,
std::optional< std::shared_ptr< spdlog::logger > >  logger = std::nullopt 
)
private

Sets the global logging format.

This function configures the default output format (e.g., console, file).

Parameters
formatThe desired output format.
loggerOptional logger instance to configure, if not provided the format is set to default logger.

Definition at line 84 of file logging.cpp.

85{
86 auto thisLogger = logger.value_or(spdlog::default_logger());
87 for(auto& sink : thisLogger->sinks()) {
88 setSinkLoggingFormat(format, sink);
89 }
90}

◆ setSinkLoggingFormat()

void irsol::setSinkLoggingFormat ( LoggingFormat  format,
std::shared_ptr< spdlog::sinks::sink >  sink 
)
private

Sets the logging format for a specific sink.

Applies the appropriate formatter string to the given sink (e.g., console, file).

Parameters
formatThe desired output format.
sinkThe sink to configure.

Definition at line 92 of file logging.cpp.

93{
94 switch(format) {
95 case LoggingFormat::FILE:
96 sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e][%^%l%$][%n][pid %P][tid %t][%s:%!():%#] %v");
97 break;
98 case LoggingFormat::CONSOLE:
99 sink->set_pattern("[%H:%M:%S.%e][%^%l%$][%n][%s:%!():%#] %v");
100 break;
101 case LoggingFormat::UNIT_TESTS:
102 sink->set_pattern("[%^%l%$][%s:%!():%#] %v");
103 break;
104 }
105}

Variable Documentation

◆ levelNameToLevelMap

const std::unordered_map<std::string, spdlog::level::level_enum> irsol::levelNameToLevelMap
inlineprivate
Initial value:
= {
{"info", spdlog::level::info},
{"warn", spdlog::level::warn},
{"error", spdlog::level::err}}

Runtime map from string names to spdlog log levels.

Allows dynamic parsing of log levels from configuration or user input.

Definition at line 254 of file logging.hpp.

254 {
255#ifdef DEBUG
256 {"trace", spdlog::level::trace},
257 {"debug", spdlog::level::debug},
258#endif
259 {"info", spdlog::level::info},
260 {"warn", spdlog::level::warn},
261 {"error", spdlog::level::err}};