24 #include <string_view>
50 namespace diagnostics {
75 LogEntry(
LogLevel lvl, std::string_view comp, std::string_view op, std::string_view msg)
92 AsyncLogConfig(
size_t max_q,
size_t batch, std::chrono::milliseconds interval)
117 start_time = std::chrono::system_clock::now();
126 return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() -
start_time);
143 static Logger& instance();
144 static Logger& default_logger();
172 void set_console_output(
bool enable);
178 void set_file_output(const std::
string& filename);
185 void set_file_output_with_rotation(const std::
string& filename,
198 bool is_async_logging_enabled()
const;
203 AsyncLogStats get_async_stats()
const;
209 void set_callback(LogCallback callback);
215 void set_outputs(
int outputs);
221 void set_enabled(
bool enabled);
226 bool is_enabled()
const;
232 void set_format(
const std::string& format);
240 void log(
LogLevel level, std::string_view component, std::string_view operation, std::string_view message);
242 void debug(std::string_view component, std::string_view operation, std::string_view message);
243 void info(std::string_view component, std::string_view operation, std::string_view message);
244 void warning(std::string_view component, std::string_view operation, std::string_view message);
245 void error(std::string_view component, std::string_view operation, std::string_view message);
246 void critical(std::string_view component, std::string_view operation, std::string_view message);
250 const Impl* get_impl()
const {
return impl_.get(); }
251 Impl* get_impl() {
return impl_.get(); }
252 std::unique_ptr<Impl> impl_;
258 #define UNILINK_LOG_DEBUG(component, operation, message) \
260 if (unilink::diagnostics::Logger::instance().get_level() <= unilink::diagnostics::LogLevel::DEBUG) { \
261 unilink::diagnostics::Logger::instance().debug(component, operation, message); \
265 #define UNILINK_LOG_INFO(component, operation, message) \
267 if (unilink::diagnostics::Logger::instance().get_level() <= unilink::diagnostics::LogLevel::INFO) { \
268 unilink::diagnostics::Logger::instance().info(component, operation, message); \
272 #define UNILINK_LOG_WARNING(component, operation, message) \
274 if (unilink::diagnostics::Logger::instance().get_level() <= unilink::diagnostics::LogLevel::WARNING) { \
275 unilink::diagnostics::Logger::instance().warning(component, operation, message); \
279 #define UNILINK_LOG_ERROR(component, operation, message) \
281 if (unilink::diagnostics::Logger::instance().get_level() <= unilink::diagnostics::LogLevel::ERROR) { \
282 unilink::diagnostics::Logger::instance().error(component, operation, message); \
286 #define UNILINK_LOG_CRITICAL(component, operation, message) \
288 if (unilink::diagnostics::Logger::instance().get_level() <= unilink::diagnostics::LogLevel::CRITICAL) { \
289 unilink::diagnostics::Logger::instance().critical(component, operation, message); \
296 #define UNILINK_LOG_DEBUG_IF(component, operation, message) \
298 if (unilink::diagnostics::Logger::instance().get_level() <= unilink::diagnostics::LogLevel::DEBUG) { \
299 UNILINK_LOG_DEBUG(component, operation, message); \
303 #define UNILINK_LOG_INFO_IF(component, operation, message) \
305 if (unilink::diagnostics::Logger::instance().get_level() <= unilink::diagnostics::LogLevel::INFO) { \
306 UNILINK_LOG_INFO(component, operation, message); \
313 #define UNILINK_LOG_PERF_START(component, operation) \
314 auto _perf_start_##operation = \
315 (unilink::diagnostics::Logger::instance().get_level() <= unilink::diagnostics::LogLevel::DEBUG) \
316 ? std::chrono::high_resolution_clock::now() \
317 : std::chrono::high_resolution_clock::time_point()
319 #define UNILINK_LOG_PERF_END(component, operation) \
321 if (unilink::diagnostics::Logger::instance().get_level() <= unilink::diagnostics::LogLevel::DEBUG) { \
322 auto _perf_end_##operation = std::chrono::high_resolution_clock::now(); \
323 using _us_t = std::chrono::microseconds; \
324 auto _diff_##operation = _perf_end_##operation - _perf_start_##operation; \
325 auto _perf_duration_##operation = std::chrono::duration_cast<_us_t>(_diff_##operation).count(); \
326 UNILINK_LOG_DEBUG(component, operation, "Duration: " + std::to_string(_perf_duration_##operation) + " μs"); \
Centralized logging system with async support.
Logger(Logger &&) noexcept
std::function< void(LogLevel level, const std::string &formatted_message)> LogCallback
LogLevel
Log severity levels.
LogOutput
Log output destinations.
Async logging configuration.
bool enable_batch_processing
std::chrono::milliseconds shutdown_timeout
std::chrono::milliseconds flush_interval
AsyncLogConfig(size_t max_q, size_t batch, std::chrono::milliseconds interval)
Async logging statistics.
uint64_t max_queue_size_reached
std::chrono::milliseconds get_uptime() const
double get_drop_rate() const
std::chrono::system_clock::time_point start_time
Log entry structure for async processing.
std::chrono::system_clock::time_point timestamp
std::string formatted_message
LogEntry(LogLevel lvl, std::string_view comp, std::string_view op, std::string_view msg)
Log rotation configuration.