From 52b3cd46c76fd4be18aeb8422a08a073484b9fad Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Sat, 29 Aug 2026 12:01:42 +0200 Subject: More module implementation partition units --- server/src/log.cppm | 128 ++++++++-------------------------------------------- 1 file changed, 20 insertions(+), 108 deletions(-) (limited to 'server/src/log.cppm') diff --git a/server/src/log.cppm b/server/src/log.cppm index 97552b6..dc8c2e1 100644 --- a/server/src/log.cppm +++ b/server/src/log.cppm @@ -1,11 +1,3 @@ -module; - -// Seems like ADL for std::quoted is broken with -// import std; -// Might be because the _Quoted_string object is defined in -// std::__detail, which is not exported by the module. -#include - export module routemon:log; import std; @@ -19,35 +11,16 @@ export enum class level : std::uint8_t { error, }; -namespace { - -auto operator<<(std::ostream& os, level lvl) -> std::ostream& -{ - switch (lvl) - { - case level::debug: - os << "dbg"; - break; - case level::info: - os << "inf"; - break; - case level::warn: - os << "wrn"; - break; - case level::error: - os << "err"; - break; - } - return os; -} - -} // namespace - export class sink { std::atomic lvl_; std::ostream& os_ = std::cout; + explicit sink(level lvl); + + friend auto make_sink(level lvl) -> std::shared_ptr; + +public: struct tmp_message { level lvl; @@ -56,35 +29,13 @@ export class sink std::map const& attrs; }; - auto write(tmp_message msg) -> void - { - auto sos = std::osyncstream{os_}; - sos << "[" << msg.lvl; - if (!msg.component.empty()) - sos << " " << msg.component; - sos << "] " << msg.txt; - for (auto const& [k, v] : msg.attrs) - { - sos << " " << k << "=" << std::quoted(v); - } - sos << '\n'; - } - - explicit sink(level lvl) : lvl_{lvl} {} - - friend auto make_sink(level lvl) -> std::shared_ptr; - friend class logger; - -public: - [[nodiscard]] auto level() const -> enum level { return lvl_; } + [[nodiscard]] auto level() const -> enum level; + auto set_level(enum level lvl) -> void; - auto set_level(enum level lvl) -> void { lvl_ = lvl; } + auto write(tmp_message msg) -> void; }; -export auto make_sink(level lvl) -> std::shared_ptr -{ - return std::shared_ptr{new sink{lvl}}; -} +export auto make_sink(level lvl) -> std::shared_ptr; export class logger { @@ -92,79 +43,40 @@ export class logger std::string component_; std::map attrs_; - template - auto log_at(std::string_view fmt, std::format_args args) -> logger& - { - if (sink_->level() <= lvl) - sink_->write( - sink::tmp_message{ - .lvl = lvl, - .component = component_, - .txt = std::vformat(fmt, args), - .attrs = attrs_, - }); - return *this; - } + auto log_at(log::level lvl, std::string_view fmt, std::format_args args) + -> logger&; public: - explicit logger(std::shared_ptr const& sink) : sink_{sink} - { - if (!sink) - { - throw std::invalid_argument{"logger sink may not be null"}; - } - } - - [[nodiscard]] auto sub(std::string_view component) const -> logger - { - auto l = *this; - if (l.component_.empty()) - { - l.component_ = component; - } - else - { - l.component_ += "."; - l.component_ += component; - } - return l; - } - - [[nodiscard]] auto with(std::string const& k, std::string&& v) const -> logger - { - auto l = *this; - l.attrs_[k] = std::move(v); - return l; - } + explicit logger(std::shared_ptr const& sink); + [[nodiscard]] auto sub(std::string_view component) const -> logger; + [[nodiscard]] auto with(std::string const& k, std::string&& v) const + -> logger; [[nodiscard]] auto with(std::string const& k, std::string_view v) const - -> logger - { - return with(k, std::string{v}); - } + -> logger; template auto debug(std::format_string fmt, Args&&... args) -> logger& { - return log_at(fmt.get(), std::make_format_args(args...)); + return log_at(level::debug, fmt.get(), std::make_format_args(args...)); } template auto info(std::format_string fmt, Args&&... args) -> logger& { - return log_at(fmt.get(), std::make_format_args(args...)); + return log_at(level::info, fmt.get(), std::make_format_args(args...)); } template auto warn(std::format_string fmt, Args&&... args) -> logger& { - return log_at(fmt.get(), std::make_format_args(args...)); + return log_at(level::warn, fmt.get(), std::make_format_args(args...)); } template auto error(std::format_string fmt, Args&&... args) -> logger& { - return log_at(fmt.get(), std::make_format_args(args...)); + return log_at(level::error, fmt.get(), std::make_format_args(args...)); } }; -- cgit v1.3