9#include "../reloco.hpp"
53template <
size_t MaxSinks = 4,
size_t MsgBufferCapacity = 256,
typename Mutex = detail::null_mutex,
54 typename Sink = log_sink,
typename Decorator = detail::identity_decorator>
60 struct RELOCO_POINTER lock_guard {
61 explicit lock_guard(Mutex &m) noexcept : m_(m) { m_.lock(); }
62 ~lock_guard()
noexcept { m_.unlock(); }
63 lock_guard(
const lock_guard &) =
delete;
64 lock_guard &operator=(
const lock_guard &) =
delete;
72 template <
typename... Sinks>
73 requires(
sizeof...(Sinks) <= MaxSinks)
75 : name_(
name), sinks_{sinks...}, sink_count_(
sizeof...(Sinks)) {}
78 lock_guard guard(mutex_);
79 if (sink_count_ >= MaxSinks)
81 sinks_[sink_count_++] = s;
87 [[nodiscard]]
constexpr microfmt::string_view
name() const & noexcept RELOCO_LIFETIMEBOUND {
return name_; }
89 [[nodiscard]]
constexpr microfmt::string_view
name() const && = delete;
102 if (!
should_log(msg.lvl) || sink_count_ == 0) {
110 template <
typename... Args>
void log(
level lvl, microfmt::string_view fmt_str,
const Args &...args)
const noexcept {
111 log_impl(std::source_location::current(), lvl, fmt_str, args...);
114 template <
typename StrProvider,
typename... Args>
116 log_impl(std::source_location::current(), lvl, fmt_str, args...);
120 template <
typename... Args>
void trace(microfmt::string_view
fmt,
const Args &...args)
const noexcept {
124 template <
typename StrProvider,
typename... Args>
129 template <
typename... Args>
void debug(microfmt::string_view
fmt,
const Args &...args)
const noexcept {
133 template <
typename StrProvider,
typename... Args>
138 template <
typename... Args>
void info(microfmt::string_view
fmt,
const Args &...args)
const noexcept {
142 template <
typename StrProvider,
typename... Args>
147 template <
typename... Args>
void warn(microfmt::string_view
fmt,
const Args &...args)
const noexcept {
151 template <
typename StrProvider,
typename... Args>
156 template <
typename... Args>
void error(microfmt::string_view
fmt,
const Args &...args)
const noexcept {
160 template <
typename StrProvider,
typename... Args>
165 template <
typename... Args>
void critical(microfmt::string_view
fmt,
const Args &...args)
const noexcept {
169 template <
typename StrProvider,
typename... Args>
175 lock_guard guard(mutex_);
176 for (
size_t i = 0; i < sink_count_; ++i) {
183 template <
typename... Args>
184 void log_loc(std::source_location loc,
level lvl, microfmt::string_view fmt_str,
const Args &...args)
const noexcept {
185 log_impl(loc, lvl, fmt_str, args...);
188 template <
typename StrProvider,
typename... Args>
190 const Args &...args)
const noexcept {
191 log_impl(loc, lvl, fmt_str, args...);
195 template <
typename Format,
typename... Args>
196 void log_impl(std::source_location loc,
level lvl, Format fmt_str,
const Args &...args)
const noexcept {
203 auto sink_stream = buf.
as_sink();
204 format_to(sink_stream, fmt_str, args...);
206 log_msg msg{.logger_name = name_, .lvl = lvl, .time = microfmt::instant::now(), .payload = buf.
view(), .loc = loc};
214 [[nodiscard]] Decorator &
decorator() &
noexcept RELOCO_LIFETIMEBOUND {
return decorator_; }
215 [[nodiscard]]
const Decorator &
decorator() const & noexcept RELOCO_LIFETIMEBOUND {
return decorator_; }
217 [[nodiscard]]
const Decorator &
decorator() const && = delete;
224 template <typename Msg>
void dispatch(const Msg &msg) const noexcept {
225 decltype(
auto) decorated = decorator_(msg);
226 lock_guard guard(mutex_);
227 for (
size_t i = 0; i < sink_count_; ++i) {
228 sinks_[i].log(decorated);
233 microfmt::string_view name_{};
236 mutable microfmt::array<Sink, MaxSinks> sinks_{};
237 size_t sink_count_{0};
238 mutable Mutex mutex_{};
239 Decorator decorator_{};
245RELOCO_BEGIN_UNSAFE_CODE
249 static logger *instance =
nullptr;
253#if defined(MICROFMT_ENABLE_DEFAULT_LOGGER) && !defined(MICROFMT_DEFAULT_LOG_SINK_BACKEND_CUSTOM)
256 return sink_instance;
260inline logger &built_in_default_logger() noexcept {
261 static logger instance(
"app", default_console_sink().as_sink());
270#if defined(MICROFMT_ENABLE_DEFAULT_LOGGER) && defined(MICROFMT_DEFAULT_LOG_SINK_BACKEND_CUSTOM)
299#include "../detail/porting/default_log_sink.hpp"
307 if (configured !=
nullptr) {
311#if defined(MICROFMT_ENABLE_DEFAULT_LOGGER)
312 return &detail::built_in_default_logger();
321template <
typename... Args>
inline void trace(microfmt::string_view
fmt,
const Args &...args)
noexcept {
327template <
typename StrProvider,
typename... Args>
330 instance->trace(
fmt, args...);
334template <
typename... Args>
inline void debug(microfmt::string_view
fmt,
const Args &...args)
noexcept {
336 instance->debug(
fmt, args...);
340template <
typename StrProvider,
typename... Args>
343 instance->debug(
fmt, args...);
347template <
typename... Args>
inline void info(microfmt::string_view
fmt,
const Args &...args)
noexcept {
349 instance->info(
fmt, args...);
353template <
typename StrProvider,
typename... Args>
356 instance->info(
fmt, args...);
360template <
typename... Args>
inline void warn(microfmt::string_view
fmt,
const Args &...args)
noexcept {
362 instance->warn(
fmt, args...);
366template <
typename StrProvider,
typename... Args>
369 instance->warn(
fmt, args...);
373template <
typename... Args>
inline void error(microfmt::string_view
fmt,
const Args &...args)
noexcept {
375 instance->error(
fmt, args...);
379template <
typename StrProvider,
typename... Args>
382 instance->error(
fmt, args...);
386template <
typename... Args>
inline void critical(microfmt::string_view
fmt,
const Args &...args)
noexcept {
388 instance->critical(
fmt, args...);
392template <
typename StrProvider,
typename... Args>
395 instance->critical(
fmt, args...);
400RELOCO_END_UNSAFE_CODE
Output sink that stores formatted characters in an internal fixed-size stack/inline buffer.
Definition microfmt.hpp:185
constexpr microfmt::string_view view() const &noexcept RELOCO_LIFETIMEBOUND
Returns a string view over the characters written so far.
Definition microfmt.hpp:245
RELOCO_END_UNSAFE_BUFFER_USAGE RELOCO_CONSTEXPR20 sink as_sink() &noexcept RELOCO_LIFETIMEBOUND
Creates a type-erased sink adapter pointing to this instance.
Definition microfmt.hpp:236
bool should_log(level l) const noexcept
Definition logger.hpp:91
void log_loc(std::source_location loc, level lvl, microfmt::string_view fmt_str, const Args &...args) const noexcept
Definition logger.hpp:184
void debug(compile_string_holder< StrProvider > fmt, const Args &...args) const noexcept
Definition logger.hpp:134
void info(microfmt::string_view fmt, const Args &...args) const noexcept
Definition logger.hpp:138
void flush() const noexcept
Definition logger.hpp:174
void trace(microfmt::string_view fmt, const Args &...args) const noexcept
Definition logger.hpp:120
Decorator & decorator() &noexcept RELOCO_LIFETIMEBOUND
The message decorator, e.g. to configure a metadata callback.
Definition logger.hpp:214
void info(compile_string_holder< StrProvider > fmt, const Args &...args) const noexcept
Definition logger.hpp:143
void set_level(level l) noexcept
Definition logger.hpp:85
void log(level lvl, microfmt::string_view fmt_str, const Args &...args) const noexcept
Definition logger.hpp:110
bool add_sink(Sink s) noexcept
Definition logger.hpp:77
void log(level lvl, compile_string_holder< StrProvider > fmt_str, const Args &...args) const noexcept
Definition logger.hpp:115
void error(compile_string_holder< StrProvider > fmt, const Args &...args) const noexcept
Definition logger.hpp:161
const Decorator & decorator() const &&=delete
constexpr basic_logger(microfmt::string_view name) noexcept
Definition logger.hpp:70
void critical(microfmt::string_view fmt, const Args &...args) const noexcept
Definition logger.hpp:165
void trace(compile_string_holder< StrProvider > fmt, const Args &...args) const noexcept
Definition logger.hpp:125
void critical(compile_string_holder< StrProvider > fmt, const Args &...args) const noexcept
Definition logger.hpp:170
void error(microfmt::string_view fmt, const Args &...args) const noexcept
Definition logger.hpp:156
void log(const log_msg &msg) const noexcept
Dispatches a caller-built log_msg directly to attached sinks.
Definition logger.hpp:101
void log_loc(std::source_location loc, level lvl, compile_string_holder< StrProvider > fmt_str, const Args &...args) const noexcept
Definition logger.hpp:189
constexpr microfmt::string_view name() const &&=delete
constexpr microfmt::string_view name() const &noexcept RELOCO_LIFETIMEBOUND
Definition logger.hpp:87
void debug(microfmt::string_view fmt, const Args &...args) const noexcept
Definition logger.hpp:129
void warn(microfmt::string_view fmt, const Args &...args) const noexcept
Definition logger.hpp:147
constexpr level get_level() const noexcept
Definition logger.hpp:86
void warn(compile_string_holder< StrProvider > fmt, const Args &...args) const noexcept
Definition logger.hpp:152
const Decorator & decorator() const &noexcept RELOCO_LIFETIMEBOUND
Definition logger.hpp:215
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
ANSI-colorized stdout adapter for structured log records.
Definition sink.hpp:204
logger *& configured_default_logger() noexcept
Definition logger.hpp:248
Definition default_log_sink.template.hpp:51
void error(microfmt::string_view fmt, const Args &...args) noexcept
Definition logger.hpp:373
void set_default_logger(logger *instance) noexcept
Sets or clears the process-default logger used by free helpers.
Definition logger.hpp:319
level
Shared log severity levels in ascending order.
Definition log_msg.hpp:22
logger * default_logger() noexcept
Returns the configured default logger, or nullptr when unset.
Definition logger.hpp:305
basic_logger< 4, 256 > logger
Definition logger.hpp:242
RELOCO_CONSTEXPR20 void format_to(const sink &out, microfmt::string_view fmt, const Args &...args) noexcept
Definition microfmt.hpp:1766
Type-erased structured logging sinks and console output.
Definition microfmt.hpp:1792
Default message decorator: forwards the record unchanged.
Definition logger.hpp:45
constexpr const log_msg & operator()(const log_msg &msg) const noexcept RELOCO_LIFETIMEBOUND
Definition logger.hpp:46
Structured log record forwarded by a logger to each sink.
Definition log_msg.hpp:69
Locking and wait-channel building blocks shared by the logging stack (basic_logger and the extended s...