microfmt
Zero-allocation C++ formatting for constrained environments
Loading...
Searching...
No Matches
extended_logger.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 Jarosław Pelczar <jarek@jpelczar.com>
2//
3// SPDX-License-Identifier: BSD-2-Clause
4
5#pragma once
6
12#include "extended_msg.hpp"
13#include "extended_sink.hpp"
14#include "logger.hpp"
15
16namespace microfmt::log {
17
26using log_meta_callback = log_meta (*)(void *user, const log_msg &msg) noexcept;
27
29class RELOCO_POINTER meta_decorator {
30public:
31 void set_callback(log_meta_callback cb, void *user = nullptr) noexcept {
32 cb_ = cb;
33 user_ = user;
34 }
35
36 [[nodiscard]] extended_log_msg operator()(const log_msg &msg) const noexcept {
37 return extended_log_msg(msg, cb_ != nullptr ? cb_(user_, msg) : log_meta{});
38 }
39
40 // Caller-built extended records already carry their metadata.
41 [[nodiscard]] const extended_log_msg &operator()(const extended_log_msg &msg) const noexcept { return msg; }
42
43private:
44 log_meta_callback cb_{nullptr};
45 void *user_{nullptr};
46};
47
69template <std::size_t MaxSinks = 4, std::size_t MsgBufferCapacity = 256, typename Mutex = detail::null_mutex>
70class extended_logger : public basic_logger<MaxSinks, MsgBufferCapacity, Mutex, extended_log_sink, meta_decorator> {
72
73public:
74 using base::base;
75 using base::log;
76
77 // low-level formatting: raw character pointers and integer width conversions bounded by the buffer sizes checked
78 // here.
79 RELOCO_BEGIN_UNSAFE_CODE
80 void set_meta_callback(log_meta_callback cb, void *user = nullptr) noexcept {
81 this->decorator().set_callback(cb, user);
82 }
84
86 void log(const extended_log_msg &msg) const noexcept {
87 if (this->should_log(msg.lvl)) {
88 this->dispatch(msg);
89 }
90 }
91};
92
93} // namespace microfmt::log
Definition logger.hpp:56
bool should_log(level l) const noexcept
Definition logger.hpp:91
Decorator & decorator() &noexcept RELOCO_LIFETIMEBOUND
The message decorator, e.g. to configure a metadata callback.
Definition logger.hpp:214
void log(const log_msg &msg) const noexcept
Dispatches a caller-built log_msg directly to attached sinks.
Definition logger.hpp:101
void dispatch(const Msg &msg) const noexcept
Decorates msg (see Decorator) and hands it to every sink under the logger's lock. Decoration runs bef...
Definition logger.hpp:224
Logger for advanced sinks. Derives from basic_logger, so the whole formatting/level/locking API is in...
Definition extended_logger.hpp:70
RELOCO_BEGIN_UNSAFE_CODE void set_meta_callback(log_meta_callback cb, void *user=nullptr) noexcept
Definition extended_logger.hpp:80
RELOCO_END_UNSAFE_CODE void log(const extended_log_msg &msg) const noexcept
Dispatches a caller-built record with explicit metadata.
Definition extended_logger.hpp:86
Decorator turning a plain log_msg into an extended_log_msg.
Definition extended_logger.hpp:29
void set_callback(log_meta_callback cb, void *user=nullptr) noexcept
Definition extended_logger.hpp:31
const extended_log_msg & operator()(const extended_log_msg &msg) const noexcept
Definition extended_logger.hpp:41
extended_log_msg operator()(const log_msg &msg) const noexcept
Definition extended_logger.hpp:36
Log record extended with execution-context metadata (pid, tid, CPU index, context flags) for "advance...
"Advanced" log sinks that see extended_log_msg metadata and can report being full,...
Configurable structured loggers and helper functions.
Definition default_log_sink.template.hpp:51
log_meta(*)(void *user, const log_msg &msg) noexcept log_meta_callback
Metadata callback: describes the current execution context.
Definition extended_logger.hpp:26
RELOCO_END_UNSAFE_CODE
Definition remote_object.hpp:132
log_msg plus log_meta. Derives from the original record, so it converts to const log_msg & anywhere t...
Definition extended_msg.hpp:62
Execution-context metadata attached to an extended_log_msg.
Definition extended_msg.hpp:32
Structured log record forwarded by a logger to each sink.
Definition log_msg.hpp:69