uatools 1.0.0-pre2
 
Loading...
Searching...
No Matches
logger.hpp
Go to the documentation of this file.
1
27
28#ifndef ESO_UATOOLS_PROTOCOL_BASE_LOGGER_HPP
29#define ESO_UATOOLS_PROTOCOL_BASE_LOGGER_HPP
30
31#include <memory>
32#include <string>
33#include <string_view>
34
35#include <fmt/format.h>
36
37#include <eso/uatools/protocol/base/base.hpp> // brings UATLOC, ThreadName, IsoTimeNow
38
40
46 enum class LogLevel : int {
47 TRACE = 0,
48 DEBUG = 10,
49 INFO = 20,
50 WARNING = 30,
51 ERROR = 40,
52 OFF = 100,
53 };
54
68 class Logger {
69 public:
70 Logger() = default;
71 virtual ~Logger() = default;
72
73 Logger(const Logger&) = delete;
74 Logger& operator=(const Logger&) = delete;
75 Logger(Logger&&) = delete;
76 Logger& operator=(Logger&&) = delete;
77
83 virtual void Emit(LogLevel level, const std::string& message) = 0;
84
92 virtual void Throw(const std::string& message);
93
94 void SetLogLevel(LogLevel level) noexcept { m_level = level; }
95 LogLevel GetLogLevel() const noexcept { return m_level; }
96
102 void Trace (const std::string& m) { Emit(LogLevel::TRACE, m); }
103 void Debug (const std::string& m) { Emit(LogLevel::DEBUG, m); }
104 void Info (const std::string& m) { Emit(LogLevel::INFO, m); }
105 void Warning(const std::string& m) { Emit(LogLevel::WARNING, m); }
106 void Error (const std::string& m) { Emit(LogLevel::ERROR, m); }
108
109 protected:
111 };
112
118 void InstallLogger(std::unique_ptr<Logger> logger) noexcept;
119
122 Logger& Log();
123
128 bool HasLogger() noexcept;
129
134 std::unique_ptr<Logger> MakeStdoutLogger();
135
140 std::unique_ptr<Logger> MakeNullLogger();
141
147 std::string_view LogLevelName(LogLevel level) noexcept;
148
155 inline std::string TraceExtra() {
156 return {};
157 }
158 template <typename... Args>
159 inline std::string TraceExtra(fmt::string_view fmt_str, Args&&... args) {
160 return ": " + fmt::vformat(fmt_str, fmt::make_format_args(args...));
161 }
162
163} // namespace eso::uatools::protocol::base
164
178
179#define UAT_LOG_IMPL_(level_, fmt_str_, ...) \
180 do { \
181 auto& _uat_log = ::eso::uatools::protocol::base::Log(); \
182 if (_uat_log.GetLogLevel() <= (level_)) { \
183 _uat_log.Emit((level_), \
184 UATLOC + ": " + \
185 ::fmt::format( \
186 ::fmt::runtime(std::string(fmt_str_)) \
187 __VA_OPT__(,) __VA_ARGS__)); \
188 } \
189 } while (0)
190
201#define UATTRACE(...) \
202 do { \
203 auto& _uat_log = ::eso::uatools::protocol::base::Log(); \
204 if (_uat_log.GetLogLevel() <= ::eso::uatools::protocol::base::LogLevel::TRACE) { \
205 _uat_log.Emit(::eso::uatools::protocol::base::LogLevel::TRACE, \
206 UATLOC + ": " + std::string(__PRETTY_FUNCTION__) + \
207 ::eso::uatools::protocol::base::TraceExtra(__VA_ARGS__)); \
208 } \
209 } while (0)
210
211#define UATDEBUG(fmt_str, ...) \
212 UAT_LOG_IMPL_(::eso::uatools::protocol::base::LogLevel::DEBUG, fmt_str __VA_OPT__(,) __VA_ARGS__)
213
214#define UATINFO(fmt_str, ...) \
215 UAT_LOG_IMPL_(::eso::uatools::protocol::base::LogLevel::INFO, fmt_str __VA_OPT__(,) __VA_ARGS__)
216
217#define UATWARNING(fmt_str, ...) \
218 UAT_LOG_IMPL_(::eso::uatools::protocol::base::LogLevel::WARNING, fmt_str __VA_OPT__(,) __VA_ARGS__)
219
220#define UATERROR(fmt_str, ...) \
221 UAT_LOG_IMPL_(::eso::uatools::protocol::base::LogLevel::ERROR, fmt_str __VA_OPT__(,) __VA_ARGS__)
222
223#define UATTHROW(fmt_str, ...) \
224 do { \
225 ::eso::uatools::protocol::base::Log().Throw( \
226 UATLOC + ": " + \
227 ::fmt::format( \
228 ::fmt::runtime(std::string(fmt_str)) \
229 __VA_OPT__(,) __VA_ARGS__)); \
230 } while (0)
231
233
234#endif // ESO_UATOOLS_PROTOCOL_BASE_LOGGER_HPP
Small VLTSW-safe base utilities used by uatools/protocol log format strings (UATLOC macro,...
void Warning(const std::string &m)
Definition logger.hpp:105
void Trace(const std::string &m)
Definition logger.hpp:102
Logger & operator=(const Logger &)=delete
void Info(const std::string &m)
Definition logger.hpp:104
void Debug(const std::string &m)
Definition logger.hpp:103
virtual void Emit(LogLevel level, const std::string &message)=0
Deliver one already-formatted log line.
void Error(const std::string &m)
Definition logger.hpp:106
virtual void Throw(const std::string &message)
Log at error level and then throw.
Definition logger.cpp:52
Logger & operator=(Logger &&)=delete
void SetLogLevel(LogLevel level) noexcept
Definition logger.hpp:94
LogLevel m_level
Definition logger.hpp:110
LogLevel GetLogLevel() const noexcept
Definition logger.hpp:95
Definition icomm_adapter_generic_v2.hpp:49
std::unique_ptr< Logger > MakeStdoutLogger()
Factory: a logger that prints to stdout.
Definition logger.cpp:77
std::string TraceExtra()
Helper used by UATTRACE.
Definition logger.hpp:155
bool HasLogger() noexcept
true iff a logger has been installed.
Definition logger.cpp:73
Logger & Log()
Access the installed logger.
Definition logger.cpp:62
std::string_view LogLevelName(LogLevel level) noexcept
Render a LogLevel as a short uppercase string.
Definition logger.cpp:85
LogLevel
Log severity, lowest to highest.
Definition logger.hpp:46
@ WARNING
Definition logger.hpp:50
@ TRACE
Definition logger.hpp:47
@ INFO
Definition logger.hpp:49
@ OFF
Definition logger.hpp:52
@ ERROR
Definition logger.hpp:51
@ DEBUG
Definition logger.hpp:48
void InstallLogger(std::unique_ptr< Logger > logger) noexcept
Install the process-wide logger.
Definition logger.cpp:57
std::unique_ptr< Logger > MakeNullLogger()
Factory: a logger that discards everything.
Definition logger.cpp:81