Oxygen Engine
Modern C++ 3D Engine using OpenGL
Loading...
Searching...
No Matches
logger.h
1#ifndef OE_IO_LOGGER_H
2#define OE_IO_LOGGER_H
3
4#include "../util/non_copyable.h"
5
6#include <sstream>
7#include <string>
8#include <mutex>
9#include <memory>
10#include <format>
11
12namespace oe::io
13{
14 class Logger;
15 class LogHandler;
16
29
36
42 typedef uint64_t LogVerbosity;
43
47 constexpr uint64_t default_log_verbosity = 0xFFFFFFFF;
48
55 {
56 public:
61 LoggerStream(LoggerStream&& other) noexcept;
62
67
75
81 template<typename T>
82 LoggerStream& operator<<(T const& data)
83 {
84 _stream << data;
85 return *this;
86 }
87
88 private:
89 LoggerStream(Logger* logger, LogLevel level, const LogVerbosity verbosity);
90
91 std::ostringstream _stream;
92
95 Logger* _logger = nullptr;
96
97 friend class Logger;
98 };
99
107 class Logger
108 {
109 public:
114
118 std::string name;
119
126
132
139 {
140 static Logger instance;
141 return instance;
142 }
143
154
165
176
187
198
209
219 {
220 return LoggerStream(this, level, verbosity);
221 }
222
229 Logger& setDefaultLevel(const LogLevel default_level)
230 {
231 _default_level = default_level;
232 return *this;
233 }
234
241 {
242 _default_verbosity = verbosity;
243 return *this;
244 }
245
259 template <typename... Args>
260 void operator()(std::string_view format, Args&&... args)
261 {
262 _write(std::vformat(format, std::make_format_args(args...)), _default_level, _default_verbosity);
263 }
264
272 template<typename T>
274 {
275 LoggerStream stream(this, _default_level, _default_verbosity);
276
277 stream << data;
278
279 return stream;
280 }
281
289 void setHandler(std::shared_ptr<LogHandler> handler);
290
299 {
300 return _handler.get();
301 }
302
310 void log(const std::ostringstream& stream, const LogLevel level = default_log_level, const LogVerbosity verbosity = default_log_verbosity);
311
312 private:
313 void _write(const std::string& message, const LogLevel level, const LogVerbosity verbosity);
314
315 LogLevel _default_level = default_log_level;
316 LogVerbosity _default_verbosity = default_log_verbosity;
317
318 std::shared_ptr<LogHandler> _handler;
319
320 std::mutex _mutex;
321 };
322
331 {
332 public:
339 virtual void write(const std::string& message, const LogLevel level) = 0;
340
350 virtual bool canWrite(const LogLevel level, const LogVerbosity verbosity)
351 {
352 return (verbosity & _logger->verbosity) && level >= _logger->minimum_level;
353 }
354
355 virtual ~LogHandler() = default;
356
360 bool write_stdout = true;
361
365 bool write_file = false;
366
367 protected:
371 Logger* _logger = nullptr;
372
373 friend class Logger;
374 };
375
382 {
383 public:
395 virtual void write(const std::string& message, const LogLevel level) override;
396 };
397}
398
399namespace oe
400{
406 extern io::Logger& log;
407}
408
409#endif
Default log handler.
Definition logger.h:382
virtual void write(const std::string &message, const LogLevel level) override
Write the log to stdout.
Handles log messages.
Definition logger.h:331
virtual void write(const std::string &message, const LogLevel level)=0
Do actions when the logger need to write a message.
Logger * _logger
Logger instance bound to this handler.
Definition logger.h:371
bool write_file
Indicate to the handler that the message should be written in a file.
Definition logger.h:365
bool write_stdout
Indicate to the handler that the message should be sent to stdout / stderr.
Definition logger.h:360
virtual bool canWrite(const LogLevel level, const LogVerbosity verbosity)
Check if the handler will write according to the the level and verbosity.
Definition logger.h:350
Add stream capabilities logs, letting you do calls like oe::log << any_variable.
Definition logger.h:55
LoggerStream(LoggerStream &&other) noexcept
Move constructor.
~LoggerStream()
Destructor.
LoggerStream & operator<<(T const &data)
Stream chaining operator.
Definition logger.h:82
LoggerStream & operator=(LoggerStream &&other) noexcept
Move operator.
Log messages.
Definition logger.h:108
Logger()
Constructor.
std::string name
Logger name to display (also used as file name if log are recorded).
Definition logger.h:118
Logger & setDefaultVerbosity(const LogVerbosity verbosity)
Set default log verbosity used when using log << gabuzomeu or log(gabuzomeu).
Definition logger.h:240
LoggerStream critical(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to receive criticals logs.
Definition logger.h:205
LoggerStream info(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to log informations.
Definition logger.h:172
LogLevel minimum_level
Log level below this one won't be sent.
Definition logger.h:125
void setHandler(std::shared_ptr< LogHandler > handler)
Set underlying log handler.
void operator()(std::string_view format, Args &&... args)
Log a formatted message using default level/verbosity.
Definition logger.h:260
LoggerStream debug(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to log debugs.
Definition logger.h:161
LoggerStream warn(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to log warnings.
Definition logger.h:183
void log(const std::ostringstream &stream, const LogLevel level=default_log_level, const LogVerbosity verbosity=default_log_verbosity)
Log a stringstream message.
LoggerStream trace(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to log traces.
Definition logger.h:150
LoggerStream as(LogLevel level, const LogVerbosity verbosity=default_log_verbosity)
Log at a specific log level. Used for example if the log level is only known at runtime.
Definition logger.h:218
LoggerStream operator<<(T const &data)
Log a message using streams.
Definition logger.h:273
LogVerbosity verbosity
Verbosity flags, used to filter logs.
Definition logger.h:131
LoggerStream error(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to log errors.
Definition logger.h:194
Logger & setDefaultLevel(const LogLevel default_level)
Set log level used when using log << gabuzomeu or log(gabuzomeu).
Definition logger.h:229
static Logger & getGlobalInstance()
Get the default global log instance.
Definition logger.h:138
LogHandler * getHandler()
Get underlying log handler.
Definition logger.h:298
Prevent class to be copied.
Definition non_copyable.h:12
Input/Output abstractions (Filesystem, Network, ...).
Definition file.h:10
uint64_t LogVerbosity
Log verbosity serves as a filter below the LogLevel.
Definition logger.h:42
constexpr LogLevel default_log_level
Default log level when no level is supplied to log functions.
Definition logger.h:35
LogLevel
Severity of the log.
Definition logger.h:21
@ LEVEL_INFO
Definition logger.h:24
@ LEVEL_TRACE
Definition logger.h:22
@ LEVEL_WARNING
Definition logger.h:25
@ LEVEL_ERROR
Definition logger.h:26
@ LEVEL_CRITICAL
Definition logger.h:27
@ LEVEL_DEBUG
Definition logger.h:23
constexpr uint64_t default_log_verbosity
Default log verbosity.
Definition logger.h:47
Oxygen Engine common namespace.
Definition debug.h:17
io::Logger & log
Global logger instance.