microfmt
Zero-allocation C++ formatting for constrained environments
Loading...
Searching...
No Matches
syslog_sink.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
9#include "../log/sink.hpp"
10#include <cstddef>
11#include <cstdint>
12#include <string_view>
13#include <syslog.h>
14
15namespace microfmt::log {
16
17template <std::size_t Capacity> class syslog_sink;
18
20template <std::size_t Capacity> struct syslog_sink_tag {};
21
23template <std::size_t Capacity = 256> class syslog_sink {
24 static_assert(Capacity > 0, "Capacity must be at least 1 byte");
25
26public:
27 using write_fn_t = void (*)(int priority, microfmt::string_view message) noexcept;
28
29 explicit constexpr syslog_sink(write_fn_t write_fn = write_to_syslog) noexcept : write_fn_(write_fn) {}
30
31 [[nodiscard]] log_sink as_sink() & noexcept RELOCO_LIFETIMEBOUND {
32 return log_sink(syslog_sink_tag<Capacity>{}, *this);
33 }
34
35 void log_impl(const log_msg &msg) noexcept {
36 if (msg.lvl == level::off) {
37 return;
38 }
39
41 const auto out = buffer.as_sink();
42 if (!msg.logger_name.empty()) {
43 microfmt::format_to(out, "[{}] ", msg.logger_name);
44 }
45 microfmt::format_to(out, "{}", msg.payload);
46 write_fn_(priority_for(msg.lvl), buffer.view());
47 }
48
49private:
50 // bridges to a C/platform API (FILE*, syslog, android log, raw chunk storage) that takes raw pointers.
51 RELOCO_BEGIN_UNSAFE_CODE
52 static void write_to_syslog(int priority, microfmt::string_view message) noexcept {
53 RELOCO_BEGIN_UNSAFE_BUFFER_USAGE;
54
55 ::syslog(priority, "%.*s", static_cast<int>(message.size()), message.data());
56
57 RELOCO_END_UNSAFE_BUFFER_USAGE;
58 }
60
61 static int priority_for(level lvl) noexcept {
62 switch (lvl) {
63 case level::trace:
64 case level::debug:
65 return LOG_DEBUG;
66 case level::info:
67 return LOG_INFO;
68 case level::warn:
69 return LOG_WARNING;
70 case level::err:
71 return LOG_ERR;
72 case level::critical:
73 return LOG_CRIT;
74 case level::off:
75 return LOG_DEBUG;
76 }
77 return LOG_DEBUG;
78 }
79
80 write_fn_t write_fn_;
81};
82
83// Explicit guides: GCC 11 cannot synthesize the implicit CTAD guide because the
84// constructor's default argument (write_to_syslog) names a member of the
85// still-incomplete class template.
87syslog_sink(void (*)(int, microfmt::string_view) noexcept) -> syslog_sink<>;
88
89template <std::size_t Capacity> struct log_sink_traits<syslog_sink_tag<Capacity>> {
91
92 static void log(value_ref<context_type> ctx, const log_msg &msg) noexcept { ctx->log_impl(msg); }
93};
94
95} // namespace microfmt::log
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
Type-erased, two-word handle to a log sink backend, plus the severity threshold below which records a...
Definition sink.hpp:73
Adapter that writes structured records to POSIX syslog.
Definition syslog_sink.hpp:23
constexpr syslog_sink(write_fn_t write_fn=write_to_syslog) noexcept
Definition syslog_sink.hpp:29
void(*)(int priority, microfmt::string_view message) noexcept write_fn_t
Definition syslog_sink.hpp:27
void log_impl(const log_msg &msg) noexcept
Definition syslog_sink.hpp:35
log_sink as_sink() &noexcept RELOCO_LIFETIMEBOUND
Definition syslog_sink.hpp:31
Definition default_log_sink.template.hpp:51
syslog_sink() -> syslog_sink<>
level
Shared log severity levels in ascending order.
Definition log_msg.hpp:22
RELOCO_CONSTEXPR20 void format_to(const sink &out, microfmt::string_view fmt, const Args &...args) noexcept
Definition microfmt.hpp:1766
RELOCO_END_UNSAFE_CODE
Definition remote_object.hpp:132
Structured log record forwarded by a logger to each sink.
Definition log_msg.hpp:69
static void log(value_ref< context_type > ctx, const log_msg &msg) noexcept
Definition syslog_sink.hpp:92
Static customization point describing a log sink backend.
Definition sink.hpp:46
Tag selecting syslog_sink<Capacity> as a log_sink backend.
Definition syslog_sink.hpp:20