opynsim
Unofficial C++ Documentation
Loading...
Searching...
No Matches
logger.h
Go to the documentation of this file.
1#pragma once
2
7
8#include <algorithm>
9#include <format>
10#include <memory>
11#include <string_view>
12#include <utility>
13#include <vector>
14
15namespace osc
16{
17 class Logger final {
18 public:
19 explicit Logger(std::string_view name) :
20 name_{name}
21 {}
22
23 Logger(std::string_view name, std::shared_ptr<LogSink> sink) :
24 name_{name},
25 log_sinks_{std::move(sink)}
26 {}
27
28 void log_message(LogLevel log_level, std::string_view message)
29 {
30 log_message(log_level, "{}", message);
31 }
32
33 template<class... Args>
34 void log_message(LogLevel log_level, std::format_string<Args...> fmt, Args&&... args)
35 {
36 if (log_level < log_level_) {
37 return; // the message's level is too low for this logger
38 }
39
40 auto it = std::ranges::find_if(log_sinks_, [log_level](const auto& sink) { return sink->should_log(log_level); });
41 if (it == log_sinks_.end()) {
42 return; // no sink in this logger will consume the message
43 }
44
45 // else: there exists at least one sink that wants the message
46
47 // format the format string with the arguments
48 const auto message = std::format(std::move(fmt), std::forward<Args>(args)...);
49
50 // create a readonly view of the message that sinks _may_ consume
51 LogMessageView view{name_, CStringView{message}, log_level};
52
53 // sink the message
54 for (; it != log_sinks_.end(); ++it) {
55 if ((*it)->should_log(view.level())) {
56 (*it)->sink_message(view);
57 }
58 }
59 }
60
61 const std::vector<std::shared_ptr<LogSink>>& sinks() const { return log_sinks_; }
62 std::vector<std::shared_ptr<LogSink>>& sinks() { return log_sinks_; }
63
64 LogLevel level() const { return log_level_; }
65 void set_level(LogLevel level_) { log_level_ = level_; }
66
67 private:
68 StringName name_;
69 std::vector<std::shared_ptr<LogSink>> log_sinks_;
70 LogLevel log_level_ = LogLevel::DEFAULT;
71 };
72}
Definition c_string_view.h:13
Definition log_message_view.h:12
Definition logger.h:17
const std::vector< std::shared_ptr< LogSink > > & sinks() const
Definition logger.h:61
Logger(std::string_view name)
Definition logger.h:19
void log_message(LogLevel log_level, std::format_string< Args... > fmt, Args &&... args)
Definition logger.h:34
std::vector< std::shared_ptr< LogSink > > & sinks()
Definition logger.h:62
void log_message(LogLevel log_level, std::string_view message)
Definition logger.h:28
LogLevel level() const
Definition logger.h:64
Logger(std::string_view name, std::shared_ptr< LogSink > sink)
Definition logger.h:23
void set_level(LogLevel level_)
Definition logger.h:65
Definition string_name.h:14
Definition custom_decoration_generator.h:5
LogLevel log_level()
Definition log.h:20
LogLevel
Definition log_level.h:11
constexpr U to(T &&value)
Definition conversion.h:56