VLink 2.0.0
A high-performance communication middleware
Loading...
Searching...
No Matches
logger.h File Reference

Global singleton logger with three output styles and pluggable backends. More...

#include <cstdio>
#include <functional>
#include <iomanip>
#include <iostream>
#include <memory>
#include <string>
#include <string_view>
#include <type_traits>
#include <utility>
#include "./exception.h"
#include "./fast_stream.h"
#include "./format.h"
#include "./macros.h"
Include dependency graph for logger.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

 Global singleton logger supporting three output styles and configurable log levels. More...
 Sentinel type indicating that no file/line detail is attached. More...
 RAII stream wrapper that accumulates tokens and flushes on destruction. More...

Namespaces

Macros

#define VLINK_LOG_GET_DETAIL(level)
 Macro Definitions.
#define VLINK_LOG_HEX(offset)
#define VLINK_LOG_HEXSS(offset)
#define VLINK_LOG_IF_T   VLinkLogger::is_writable(VLinkLogger::kTrace)
#define VLINK_LOG_IF_D   VLinkLogger::is_writable(VLinkLogger::kDebug)
#define VLINK_LOG_IF_I   VLinkLogger::is_writable(VLinkLogger::kInfo)
#define VLINK_LOG_IF_W   VLinkLogger::is_writable(VLinkLogger::kWarn)
#define VLINK_LOG_IF_E   VLinkLogger::is_writable(VLinkLogger::kError)
#define VLINK_LOG_IF_F   VLinkLogger::is_writable(VLinkLogger::kFatal)
#define VLINK_LOG_T(...)
#define VLINK_LOG_D(...)
#define VLINK_LOG_I(...)
#define VLINK_LOG_W(...)
#define VLINK_LOG_E(...)
#define VLINK_LOG_F(...)
#define VLINK_MLOG_T(...)
#define VLINK_MLOG_D(...)
#define VLINK_MLOG_I(...)
#define VLINK_MLOG_W(...)
#define VLINK_MLOG_E(...)
#define VLINK_MLOG_F(...)
#define VLINK_CLOG_T(...)
#define VLINK_CLOG_D(...)
#define VLINK_CLOG_I(...)
#define VLINK_CLOG_W(...)
#define VLINK_CLOG_E(...)
#define VLINK_CLOG_F(...)
#define VLINK_SLOG_T   VLinkLogger::WrapperStream<VLinkLogger::kTrace>(VLINK_LOG_GET_DETAIL(VLinkLogger::kTrace))
#define VLINK_SLOG_D   VLinkLogger::WrapperStream<VLinkLogger::kDebug>(VLINK_LOG_GET_DETAIL(VLinkLogger::kDebug))
#define VLINK_SLOG_I   VLinkLogger::WrapperStream<VLinkLogger::kInfo>(VLINK_LOG_GET_DETAIL(VLinkLogger::kInfo))
#define VLINK_SLOG_W   VLinkLogger::WrapperStream<VLinkLogger::kWarn>(VLINK_LOG_GET_DETAIL(VLinkLogger::kWarn))
#define VLINK_SLOG_E   VLinkLogger::WrapperStream<VLinkLogger::kError>(VLINK_LOG_GET_DETAIL(VLinkLogger::kError))
#define VLINK_SLOG_F   VLinkLogger::WrapperStream<VLinkLogger::kFatal>(VLINK_LOG_GET_DETAIL(VLinkLogger::kFatal))
#define VLOG_T(...)
#define VLOG_D(...)
#define VLOG_I(...)
#define VLOG_W(...)
#define VLOG_E(...)
#define VLOG_F(...)
#define CLOG_T(...)
#define CLOG_D(...)
#define CLOG_I(...)
#define CLOG_W(...)
#define CLOG_E(...)
#define CLOG_F(...)
#define MLOG_T(...)
#define MLOG_D(...)
#define MLOG_I(...)
#define MLOG_W(...)
#define MLOG_E(...)
#define MLOG_F(...)
#define SLOG_T   VLINK_SLOG_T
#define SLOG_D   VLINK_SLOG_D
#define SLOG_I   VLINK_SLOG_I
#define SLOG_W   VLINK_SLOG_W
#define SLOG_E   VLINK_SLOG_E
#define SLOG_F   VLINK_SLOG_F

Typedefs

using VLinkLogger = vlink::Logger

Detailed Description

Global singleton logger with three output styles and pluggable backends.

Logger is the central logging facility in VLink. It is a singleton accessed via Logger::get() and initialised once with Logger::init(). Log messages can be written to a console sink and/or a file sink, each with an independently configured minimum level.

Output styles:

Style Syntax Notes
Stream style (LOG) VLOG_I("x=", x) Uses FastStream operator<<, zero allocation
Format style (MLOG) MLOG_I("x={}", x) Uses VLink format::format_to_n
C style (CLOG) CLOG_I("x=%d", x) Uses std::snprintf
RAII stream (SLOG) SLOG_I << "x=" << x WrapperStream, flushed on destruction

Log levels:

Value Name Use case
0 kTrace Verbose internals
1 kDebug Developer diagnostics
2 kInfo Normal operational messages
3 kWarn Unusual but recoverable conditions
4 kError Errors that may affect operation
5 kFatal Unrecoverable errors; throws RuntimeError
6 kOff Disables all output

Detail annotation: When the log level is >= kDetailLevel (default: kWarn), the macro automatically prepends {filename:line} to the message to aid in debugging.

Compile-time filtering:

  • Define VLINK_LOG_LEVEL=N to strip levels below N at compile time (zero overhead).
  • Define VLINK_LOG_DETAIL_LEVEL=N to change the threshold at which file/line is shown.
  • Define VLINK_LOG_DISABLE_SHORT to suppress the short VLOG_* aliases.

Backtrace support: When enabled via enable_backtrace(n), the last n log messages are kept in a ring buffer and can be flushed on demand with dump_backtrace().

Backend support: The logger dispatches to spdlog, quill, DLT (automotive), Android logcat, QNX slog2, or kmsg depending on compile-time configuration. Custom backends can be registered with register_console_handler() / register_file_handler().

Note
  • kFatal logs flush the logger and then throw Exception::RuntimeError.
  • The WrapperStream class is template-based; unused log levels are compiled away.
Example
vlink::Logger::init("my_app", "/var/log/my_app.log");
VLOG_I("node started, id=", node_id);
MLOG_W("temperature is {} C", temp);
CLOG_E("errno=%d", errno);
SLOG_D << "values: " << a << " " << b;
#define CLOG_E(...)
Definition logger.h:866
#define SLOG_D
Definition logger.h:884
#define VLOG_I(...)
Definition logger.h:850
#define MLOG_W(...)
Definition logger.h:876

Macro Definition Documentation

◆ CLOG_D

#define CLOG_D ( ...)
Value:
VLINK_CLOG_D(__VA_ARGS__)
#define VLINK_CLOG_D(...)
Definition logger.h:817

◆ CLOG_E

#define CLOG_E ( ...)
Value:
VLINK_CLOG_E(__VA_ARGS__)
#define VLINK_CLOG_E(...)
Definition logger.h:826

◆ CLOG_F

#define CLOG_F ( ...)
Value:
VLINK_CLOG_F(__VA_ARGS__)
#define VLINK_CLOG_F(...)
Definition logger.h:829

◆ CLOG_I

#define CLOG_I ( ...)
Value:
VLINK_CLOG_I(__VA_ARGS__)
#define VLINK_CLOG_I(...)
Definition logger.h:820

◆ CLOG_T

#define CLOG_T ( ...)
Value:
VLINK_CLOG_T(__VA_ARGS__)
#define VLINK_CLOG_T(...)
Definition logger.h:814

◆ CLOG_W

#define CLOG_W ( ...)
Value:
VLINK_CLOG_W(__VA_ARGS__)
#define VLINK_CLOG_W(...)
Definition logger.h:823

◆ MLOG_D

#define MLOG_D ( ...)
Value:
VLINK_MLOG_D(__VA_ARGS__)
#define VLINK_MLOG_D(...)
Definition logger.h:799

◆ MLOG_E

#define MLOG_E ( ...)
Value:
VLINK_MLOG_E(__VA_ARGS__)
#define VLINK_MLOG_E(...)
Definition logger.h:808

◆ MLOG_F

#define MLOG_F ( ...)
Value:
VLINK_MLOG_F(__VA_ARGS__)
#define VLINK_MLOG_F(...)
Definition logger.h:811

◆ MLOG_I

#define MLOG_I ( ...)
Value:
VLINK_MLOG_I(__VA_ARGS__)
#define VLINK_MLOG_I(...)
Definition logger.h:802

◆ MLOG_T

#define MLOG_T ( ...)
Value:
VLINK_MLOG_T(__VA_ARGS__)
#define VLINK_MLOG_T(...)
Definition logger.h:796

◆ MLOG_W

#define MLOG_W ( ...)
Value:
VLINK_MLOG_W(__VA_ARGS__)
#define VLINK_MLOG_W(...)
Definition logger.h:805

◆ SLOG_D

#define SLOG_D   VLINK_SLOG_D

◆ SLOG_E

#define SLOG_E   VLINK_SLOG_E

◆ SLOG_F

#define SLOG_F   VLINK_SLOG_F

◆ SLOG_I

#define SLOG_I   VLINK_SLOG_I

◆ SLOG_T

#define SLOG_T   VLINK_SLOG_T

◆ SLOG_W

#define SLOG_W   VLINK_SLOG_W

◆ VLINK_CLOG_D

#define VLINK_CLOG_D ( ...)
Value:
#define VLINK_LOG_GET_DETAIL(level)
Macro Definitions.
Definition logger.h:753

◆ VLINK_CLOG_E

#define VLINK_CLOG_E ( ...)

◆ VLINK_CLOG_F

#define VLINK_CLOG_F ( ...)

◆ VLINK_CLOG_I

◆ VLINK_CLOG_T

#define VLINK_CLOG_T ( ...)

◆ VLINK_CLOG_W

#define VLINK_CLOG_W ( ...)

◆ VLINK_LOG_D

#define VLINK_LOG_D ( ...)
Value:

◆ VLINK_LOG_E

◆ VLINK_LOG_F

◆ VLINK_LOG_GET_DETAIL

#define VLINK_LOG_GET_DETAIL ( level)
Value:
([]() -> auto { \
if constexpr ((level) >= VLinkLogger::kDetailLevel) { \
} else { \
return VLinkLogger::NoDetail{}; \
} \
})()

Macro Definitions.

◆ VLINK_LOG_HEX

#define VLINK_LOG_HEX ( offset)
Value:
std::hex, std::uppercase, std::setw(offset), std::setfill('0')

◆ VLINK_LOG_HEXSS

#define VLINK_LOG_HEXSS ( offset)
Value:
std::hex << std::uppercase << std::setw(offset) << std::setfill('0')

◆ VLINK_LOG_I

◆ VLINK_LOG_IF_D

#define VLINK_LOG_IF_D   VLinkLogger::is_writable(VLinkLogger::kDebug)

◆ VLINK_LOG_IF_E

#define VLINK_LOG_IF_E   VLinkLogger::is_writable(VLinkLogger::kError)

◆ VLINK_LOG_IF_F

#define VLINK_LOG_IF_F   VLinkLogger::is_writable(VLinkLogger::kFatal)

◆ VLINK_LOG_IF_I

#define VLINK_LOG_IF_I   VLinkLogger::is_writable(VLinkLogger::kInfo)

◆ VLINK_LOG_IF_T

#define VLINK_LOG_IF_T   VLinkLogger::is_writable(VLinkLogger::kTrace)

◆ VLINK_LOG_IF_W

#define VLINK_LOG_IF_W   VLinkLogger::is_writable(VLinkLogger::kWarn)

◆ VLINK_LOG_T

◆ VLINK_LOG_W

◆ VLINK_MLOG_D

#define VLINK_MLOG_D ( ...)
Value:

◆ VLINK_MLOG_E

◆ VLINK_MLOG_F

◆ VLINK_MLOG_I

◆ VLINK_MLOG_T

◆ VLINK_MLOG_W

◆ VLINK_SLOG_D

◆ VLINK_SLOG_E

◆ VLINK_SLOG_F

◆ VLINK_SLOG_I

◆ VLINK_SLOG_T

◆ VLINK_SLOG_W

◆ VLOG_D

#define VLOG_D ( ...)
Value:
VLINK_LOG_D(__VA_ARGS__)
#define VLINK_LOG_D(...)
Definition logger.h:781

◆ VLOG_E

#define VLOG_E ( ...)
Value:
VLINK_LOG_E(__VA_ARGS__)
#define VLINK_LOG_E(...)
Definition logger.h:790

◆ VLOG_F

#define VLOG_F ( ...)
Value:
VLINK_LOG_F(__VA_ARGS__)
#define VLINK_LOG_F(...)
Definition logger.h:793

◆ VLOG_I

#define VLOG_I ( ...)
Value:
VLINK_LOG_I(__VA_ARGS__)
#define VLINK_LOG_I(...)
Definition logger.h:784

◆ VLOG_T

#define VLOG_T ( ...)
Value:
VLINK_LOG_T(__VA_ARGS__)
#define VLINK_LOG_T(...)
Definition logger.h:778

◆ VLOG_W

#define VLOG_W ( ...)
Value:
VLINK_LOG_W(__VA_ARGS__)
#define VLINK_LOG_W(...)
Definition logger.h:787

Typedef Documentation

◆ VLinkLogger