Oxygen Engine
Modern C++ 3D Engine using OpenGL
Loading...
Searching...
No Matches
logger.h
1#ifndef OE_CORE_LOGGER_H
2#define OE_CORE_LOGGER_H
3
4#include "../common.h"
5#include "../util/non_copyable.h"
6
7#include "../lib/fmt.h"
8
9#include <sstream>
10#include <string>
11#include <mutex>
12#include <memory>
13
14namespace oe::core
15{
16 class Logger;
17 class LogHandler;
18
31
38
44 typedef uint64_t LogVerbosity;
45
49 constexpr uint64_t default_log_verbosity = 0xFFFFFFFF;
50
57 {
58 public:
63 LoggerStream(LoggerStream&& other) noexcept;
64
69
77
83 template<typename T>
84 LoggerStream& operator<<(T const& data)
85 {
86 _stream << data;
87 return *this;
88 }
89
90 private:
91 LoggerStream(Logger* logger, LogLevel level, const LogVerbosity verbosity);
92
93 std::ostringstream _stream;
94
97 Logger* _logger = nullptr;
98
99 friend class Logger;
100 };
101
109 class Logger
110 {
111 public:
116
120 std::string name;
121
128
134
141 {
142 static oe::core::Logger instance;
143 return instance;
144 }
145
156
167
178
189
200
211
221 {
222 return LoggerStream(this, level, verbosity);
223 }
224
231 Logger& setDefaultLevel(const LogLevel default_level)
232 {
233 _default_level = default_level;
234 return *this;
235 }
236
243 {
244 _default_verbosity = verbosity;
245 return *this;
246 }
247
264 template <typename... Args>
265 void operator()(fmt::format_string<Args...> format, Args&&... args)
266 {
267 _write(fmt::vformat(format, fmt::make_format_args(args...)), _default_level, _default_verbosity);
268 }
269
277 template<typename T>
279 {
280 LoggerStream stream(this, _default_level, _default_verbosity);
281
282 stream << data;
283
284 return stream;
285 }
286
294 void setHandler(std::unique_ptr<LogHandler> handler);
295
304 {
305 return _handler.get();
306 }
307
315 void log(const std::ostringstream& stream, const LogLevel level = default_log_level, const LogVerbosity verbosity = default_log_verbosity);
316
317 private:
318 void _write(const std::string& message, const LogLevel level, const LogVerbosity verbosity);
319
320 LogLevel _default_level = default_log_level;
321 LogVerbosity _default_verbosity = default_log_verbosity;
322
323 std::unique_ptr<LogHandler> _handler;
324
325 std::mutex _mutex;
326 };
327
336 {
337 public:
344 virtual void write(const std::string& message, const LogLevel level) = 0;
345
355 virtual bool canWrite(const LogLevel level, const LogVerbosity verbosity)
356 {
357 return (verbosity & _logger->verbosity) && level >= _logger->minimum_level;
358 }
359
360 virtual ~LogHandler() = default;
361
365 bool write_stdout = true;
366
370 bool write_file = false;
371
372 protected:
376 Logger* _logger = nullptr;
377
378 friend class Logger;
379 };
380
387 {
388 public:
400 virtual void write(const std::string& message, const LogLevel level) override;
401 };
402}
403
404namespace oe
405{
409 extern core::Logger& log;
410}
411
412#endif
Default log handler.
Definition logger.h:387
virtual void write(const std::string &message, const LogLevel level) override
Write the log to stdout.
Handles log messages.
Definition logger.h:336
bool write_file
Indicate to the handler that the message should be written in a file.
Definition logger.h:370
bool write_stdout
Indicate to the handler that the message should be sent to stdout / stderr.
Definition logger.h:365
Logger * _logger
Logger instance bound to this handler.
Definition logger.h:376
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:355
virtual void write(const std::string &message, const LogLevel level)=0
Do actions when the logger need to write a message.
Add stream capabilities logs, letting you do calls like oe::log << any_variable
Definition logger.h:57
LoggerStream(LoggerStream &&other) noexcept
Move constructor.
~LoggerStream()
Destructor.
LoggerStream & operator<<(T const &data)
Stream chaining operator.
Definition logger.h:84
LoggerStream & operator=(LoggerStream &&other) noexcept
Move operator.
Log messages.
Definition logger.h:110
LogHandler * getHandler()
Get underlying log handler.
Definition logger.h:303
LoggerStream debug(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to log debugs.
Definition logger.h:163
LogLevel minimum_level
Log level below this one won't be sent.
Definition logger.h:127
std::string name
Logger name to display (also used as file name if log are recorded)
Definition logger.h:120
LoggerStream warn(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to log warnings.
Definition logger.h:185
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:220
LoggerStream trace(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to log traces.
Definition logger.h:152
Logger()
Constructor.
LoggerStream operator<<(T const &data)
Log a message using streams.
Definition logger.h:278
LoggerStream error(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to log errors.
Definition logger.h:196
Logger & setDefaultLevel(const LogLevel default_level)
Set log level used when using log << gabuzomeu or log(gabuzomeu)
Definition logger.h:231
LoggerStream info(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to log informations.
Definition logger.h:174
Logger & setDefaultVerbosity(const LogVerbosity verbosity)
Set default log verbosity used when using log << gabuzomeu or log(gabuzomeu)
Definition logger.h:242
void log(const std::ostringstream &stream, const LogLevel level=default_log_level, const LogVerbosity verbosity=default_log_verbosity)
Log a stringstream message.
static Logger & getGlobalInstance()
Get the default global log instance.
Definition logger.h:140
LogVerbosity verbosity
Verbosity flags, used to filter logs.
Definition logger.h:133
LoggerStream critical(const LogVerbosity verbosity=default_log_verbosity)
Prepare and return a logger stream to receive criticals logs.
Definition logger.h:207
void setHandler(std::unique_ptr< LogHandler > handler)
Set underlying log handler.
void operator()(fmt::format_string< Args... > format, Args &&... args)
Log a formatted message using default level/verbosity.
Definition logger.h:265
Prevent class to be copied.
Definition non_copyable.h:12
Core functionality (windows, event handler, logger, ...)
Definition cursor.h:8
LogLevel
Severity of the log.
Definition logger.h:23
constexpr LogLevel default_log_level
Default log level when no level is supplied to log functions.
Definition logger.h:37
uint64_t LogVerbosity
Log verbosity serves as a filter below the LogLevel.
Definition logger.h:44
constexpr uint64_t default_log_verbosity
Default log verbosity.
Definition logger.h:49
Oxygen Engine common namespace.
Definition cursor.h:8
core::Logger & log