Iguana 0.0.0
Implementation Guardian of Analysis Algorithms
Loading...
Searching...
No Matches
Logger.h
1#pragma once
2
3#include <fmt/color.h>
4#include <fmt/format.h>
5#include <fmt/ranges.h>
6
7#include <functional>
8#include <unordered_map>
9
10namespace iguana {
11
17 class Logger
18 {
19
20 friend class Object;
21
22 public:
23
32 enum Level {
33 trace,
34 debug,
35 info,
36 quiet,
37 warn,
38 error,
39 silent
40 };
41
43 static Level const DEFAULT_LEVEL = info;
44
48 Logger(std::string_view name = "log", Level const lev = DEFAULT_LEVEL, bool const enable_style = true);
49 ~Logger() {}
50
54 void SetLevel(std::string_view lev);
55
59 void SetLevel(Level const lev);
60
64
67
70
75 static std::string Header(std::string_view message, int const width = 50);
76
78 template <typename... VALUES>
79 void Trace(std::string_view message, const VALUES... vals) const { Print(trace, message, vals...); }
81 template <typename... VALUES>
82 void Debug(std::string_view message, const VALUES... vals) const { Print(debug, message, vals...); }
84 template <typename... VALUES>
85 void Info(std::string_view message, const VALUES... vals) const { Print(info, message, vals...); }
87 template <typename... VALUES>
88 void Warn(std::string_view message, const VALUES... vals) const { Print(warn, message, vals...); }
90 template <typename... VALUES>
91 void Error(std::string_view message, const VALUES... vals) const { Print(error, message, vals...); }
92
98 template <typename... VALUES>
99 void Print(Level const lev, std::string_view message, const VALUES... vals) const
100 {
101 if(lev >= m_level) {
102 if(auto it{m_level_names.find(lev)}; it != m_level_names.end()) {
103 std::function<std::string(std::string)> style = [](std::string s)
104 { return fmt::format("[{}]", s); };
105 if(m_enable_style) {
106 switch(lev) {
107 case warn:
108 style = [](std::string s)
109 { return fmt::format("[{}]", fmt::styled(s, fmt::emphasis::bold | fmt::fg(fmt::terminal_color::magenta))); };
110 break;
111 case error:
112 style = [](std::string s)
113 { return fmt::format("[{}]", fmt::styled(s, fmt::emphasis::bold | fmt::fg(fmt::terminal_color::red))); };
114 break;
115 default:
116 style = [](std::string s)
117 { return fmt::format("[{}]", fmt::styled(s, fmt::emphasis::bold)); };
118 }
119 }
120 fmt::print(
121 lev >= warn ? stderr : stdout,
122 fmt::runtime(fmt::format("{} {} {}\n", style(it->second), style(m_name), message)),
123 vals...);
124 }
125 else {
126 Warn("Logger::Print called with unknown log level '{}'; printing as error instead", static_cast<int>(lev)); // FIXME: static_cast -> fmt::underlying, but needs new version of fmt
127 Error(message, vals...);
128 }
129 }
130 }
131
132 private:
133
135 std::string m_name;
136
138 Level m_level;
139
141 std::unordered_map<Level, std::string> m_level_names;
142
144 bool m_enable_style;
145 };
146}
void Info(std::string_view message, const VALUES... vals) const
Printout a log message at the info level.
Definition Logger.h:85
void Error(std::string_view message, const VALUES... vals) const
Printout a log message at the error level.
Definition Logger.h:91
void EnableStyle()
Enable styled log printouts, with color and emphasis.
Logger(std::string_view name="log", Level const lev=DEFAULT_LEVEL, bool const enable_style=true)
void Trace(std::string_view message, const VALUES... vals) const
Printout a log message at the trace level.
Definition Logger.h:79
void Debug(std::string_view message, const VALUES... vals) const
Printout a log message at the debug level.
Definition Logger.h:82
void Print(Level const lev, std::string_view message, const VALUES... vals) const
Definition Logger.h:99
static std::string Header(std::string_view message, int const width=50)
void SetLevel(std::string_view lev)
void Warn(std::string_view message, const VALUES... vals) const
Printout a log message at the warn level.
Definition Logger.h:88
Level GetLevel()
void SetLevel(Level const lev)
static Level const DEFAULT_LEVEL
The default log level.
Definition Logger.h:43
void DisableStyle()
Disable styled log printout color and emphasis.
General, top-level namespace for algorithms and infrastructure. For algorithms and bindings,...
Definition Algorithm.h:14