opynsim
Unofficial C++ Documentation
Loading...
Searching...
No Matches
logger.h
Go to the documentation of this file.
1#pragma once
2
8
9#include <algorithm>
10#include <cstdarg>
11#include <cstddef>
12#include <cstdio>
13#include <memory>
14#include <string_view>
15#include <utility>
16#include <vector>
17
18namespace osc
19{
20 class Logger final {
21 public:
22 explicit Logger(std::string_view name) :
23 name_{name}
24 {}
25
26 Logger(std::string_view name, std::shared_ptr<LogSink> sink) :
27 name_{name},
28 log_sinks_{std::move(sink)}
29 {}
30
33 {
34 if (log_level < log_level_) {
35 return; // the message's level is too low for this logger
36 }
37
38 auto it = std::ranges::find_if(log_sinks_, [log_level](const auto& sink) { return sink->should_log(log_level); });
39 if (it == log_sinks_.end()) {
40 return; // no sink in this logger will consume the message
41 }
42
43 // else: there exists at least one sink that wants the message
44
45 // format the format string with the arguments
46 std::vector<char> formatted_buffer(2048);
47 size_t n = 0;
48 {
51 const int rv = std::vsnprintf(formatted_buffer.data(), formatted_buffer.size(), fmt.c_str(), args);
52 va_end(args);
53
54 if (rv <= 0) {
55 return; // formatting error: exit early
56 }
57
58 n = min(static_cast<size_t>(rv), formatted_buffer.size()-1);
59 }
60
61 // create a readonly view of the message that sinks _may_ consume
63
64 // sink the message
65 for (; it != log_sinks_.end(); ++it) {
66 if ((*it)->should_log(view.level())) {
67 (*it)->sink_message(view);
68 }
69 }
70 }
71
72 const std::vector<std::shared_ptr<LogSink>>& sinks() const { return log_sinks_; }
73 std::vector<std::shared_ptr<LogSink>>& sinks() { return log_sinks_; }
74
75 LogLevel level() const { return log_level_; }
76 void set_level(LogLevel level_) { log_level_ = level_; }
77
78 private:
79 StringName name_;
80 std::vector<std::shared_ptr<LogSink>> log_sinks_;
81 LogLevel log_level_ = LogLevel::DEFAULT;
82 };
83}
Definition c_string_view.h:12
constexpr const_pointer data() const
Definition c_string_view.h:82
Definition log_message_view.h:12
Definition logger.h:20
void log_message(LogLevel log_level, CStringView fmt,...)
Formats fmt with std::vsnprintf and then logs the formatted message with level log_level.
Definition logger.h:32
const std::vector< std::shared_ptr< LogSink > > & sinks() const
Definition logger.h:72
Logger(std::string_view name)
Definition logger.h:22
std::vector< std::shared_ptr< LogSink > > & sinks()
Definition logger.h:73
LogLevel level() const
Definition logger.h:75
Logger(std::string_view name, std::shared_ptr< LogSink > sink)
Definition logger.h:26
void set_level(LogLevel level_)
Definition logger.h:76
Definition string_name.h:14
Definition custom_decoration_generator.h:5
constexpr auto min(Angle< Rep1, Units1 > x, Angle< Rep2, Units2 > y) -> std::common_type_t< decltype(x), decltype(y)>
Definition angle.h:267
LogLevel log_level()
Definition log.h:23
LogLevel
Definition log_level.h:11
constexpr U to(T &&value)
Definition conversion.h:56