Helios Engine
A modular ECS based data-oriented C++23 game engine framework
Loading...
Searching...
No Matches
logger.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <format>
6#include <memory>
7#include <mutex>
8#include <shared_mutex>
9#include <source_location>
10#include <string>
11#include <string_view>
12#include <unordered_map>
13
14namespace spdlog {
15
16// Forward declaration for spdlog::logger
17class logger;
18
19} // namespace spdlog
20
21namespace helios::log {
22
23/// @brief Default logger type.
25 static constexpr std::string_view kName = "HELIOS";
26#ifdef HELIOS_RELEASE_MODE
27 static constexpr auto kConfig = Config::Release();
28#else
29 static constexpr auto kConfig = Config::Debug();
30#endif
31};
32
33/// @brief Constexpr instance of the default logger for easier user interface.
34inline constexpr DefaultLogger kDefaultLogger{};
35
36/**
37 * @brief Centralized logging system with configurable output and formatting.
38 * @note Thread-safe.
39 */
40class Logger {
41public:
42 Logger(const Logger&) = delete;
43 Logger(Logger&&) = delete;
44 ~Logger() noexcept = default;
45
46 Logger& operator=(const Logger&) = delete;
47 Logger& operator=(Logger&&) = delete;
48
49 /**
50 * @brief Gets the singleton instance.
51 * @return Reference to the Logger instance
52 */
53 [[nodiscard]] static Logger& Instance() noexcept {
54 static Logger instance;
55 return instance;
56 }
57
58 /**
59 * @brief Adds a logger with the specified type and configuration.
60 * @tparam T Logger type
61 * @param logger Logger type instance
62 * @param config Configuration for the logger
63 */
64 template <LoggerTrait T>
65 void AddLogger(T logger, Config config = LoggerConfigOf<T>()) noexcept;
66
67 /**
68 * @brief Removes a logger with the given type.
69 * @note Cannot remove the default logger
70 * @tparam T Logger type
71 * @param logger Logger type instance
72 */
73 template <LoggerTrait T>
74 void RemoveLogger(T logger = {}) noexcept;
75
76 /// @brief Flushes all registered loggers.
77 void FlushAll() noexcept;
78
79 /**
80 * @brief Flushes a specific logger.
81 * @tparam T Logger type
82 * @param logger Logger type instance
83 */
84 template <LoggerTrait T>
85 void Flush(T /*logger*/ = {}) noexcept {
86 FlushImpl(LoggerTypeIndex::From<T>());
87 }
88
89 /**
90 * @brief Logs a string message with typed logger.
91 * @tparam T Logger type
92 * @param logger Logger type instance
93 * @param level Log severity level
94 * @param message Message to log
95 */
96 template <LoggerTrait T>
97 void Log(T logger, Level level, std::string_view message) noexcept;
98
99 /**
100 * @brief Logs a formatted message with typed logger.
101 * @tparam T Logger type
102 * @tparam Args Types of the format arguments
103 * @param logger Logger type instance
104 * @param level Log severity level
105 * @param fmt Format string
106 * @param args Arguments for the format string
107 */
108 template <LoggerTrait T, typename... Args>
109 requires(sizeof...(Args) > 0)
110 void Log(T logger, Level level, std::format_string<Args...> fmt,
111 Args&&... args) noexcept;
112
113 /**
114 * @brief Logs a string message with default logger.
115 * @param level Log severity level
116 * @param message Message to log
117 */
118 void Log(Level level, std::string_view message) noexcept;
119
120 /**
121 * @brief Logs a formatted message with default logger.
122 * @tparam Args Types of the format arguments
123 * @param level Log severity level
124 * @param fmt Format string
125 * @param args Arguments for the format string
126 */
127 template <typename... Args>
128 requires(sizeof...(Args) > 0)
129 void Log(Level level, std::format_string<Args...> fmt,
130 Args&&... args) noexcept;
131
132 /**
133 * @brief Sets the global default configuration for new loggers.
134 * @param config The configuration to use as default
135 */
136 void SetDefaultConfig(const Config& config) noexcept {
137 default_config_ = config;
138 }
139
140 /**
141 * @brief Sets the minimum log level for a typed logger.
142 * @tparam T Logger type
143 * @param logger Logger type instance
144 * @param level Minimum log level to set
145 */
146 template <LoggerTrait T>
147 void SetLevel(T /*logger*/, Level level) noexcept {
148 SetLevelImpl(LoggerTypeIndex::From<T>(), level);
149 }
150
151 /**
152 * @brief Sets the minimum log level for the default logger.
153 * @param level Minimum log level to set
154 */
155 void SetLevel(Level level) noexcept;
156
157 /**
158 * @brief Checks if a logger with the given type exists.
159 * @tparam T Logger type
160 * @param logger Logger type instance
161 * @return True if the logger exists, false otherwise
162 */
163 template <LoggerTrait T>
164 [[nodiscard]] bool HasLogger(T logger = {}) const noexcept;
165
166 /**
167 * @brief Checks if the default logger should log messages at the given level.
168 * @param level The log level to check
169 * @return True if messages at this level should be logged
170 */
171 [[nodiscard]] bool ShouldLog(Level level) const noexcept;
172
173 /**
174 * @brief Checks if a typed logger should log messages at the given level.
175 * @tparam T Logger type
176 * @param logger Logger type instance
177 * @param level The log level to check
178 * @return True if messages at this level should be logged
179 */
180 template <LoggerTrait T>
181 [[nodiscard]] bool ShouldLog(T /*logger*/, Level level) const noexcept {
182 return ShouldLogImpl(LoggerTypeIndex::From<T>(), level);
183 }
184
185 /**
186 * @brief Gets the current log level for a typed logger.
187 * @tparam T Logger type
188 * @param logger Logger type instance
189 * @return The current log level, or `Level::kTrace` if logger doesn't exist
190 */
191 template <LoggerTrait T>
192 [[nodiscard]] Level GetLevel(T /*logger*/ = {}) const noexcept {
193 return GetLevelImpl(LoggerTypeIndex::From<T>());
194 }
195
196 /**
197 * @brief Gets the current log level for the default logger.
198 * @return The current log level
199 */
200 [[nodiscard]] Level GetLevel() const noexcept;
201
202 /**
203 * @brief Gets the current default configuration.
204 * @return The default logger configuration
205 */
206 [[nodiscard]] const Config& GetDefaultConfig() const noexcept {
207 return default_config_;
208 }
209
210private:
211 Logger() noexcept;
212
213 [[nodiscard]] auto GetLogger(LoggerTypeIndex logger_index) const noexcept
214 -> std::shared_ptr<spdlog::logger>;
215 [[nodiscard]] auto GetDefaultLogger() const noexcept
216 -> std::shared_ptr<spdlog::logger> {
217 return GetLogger(LoggerTypeIndex::From<DefaultLogger>());
218 }
219
220 /**
221 * @brief Flushes a specific logger by index (internal).
222 * @param logger_index Logger index
223 */
224 void FlushImpl(LoggerTypeIndex logger_index) noexcept;
225
226 /**
227 * @brief Sets the minimum log level for a logger by index (internal).
228 * @param logger_index Logger index
229 * @param level Minimum log level to set
230 */
231 void SetLevelImpl(LoggerTypeIndex logger_index, Level level) noexcept;
232
233 /**
234 * @brief Checks if a logger by index should log messages at the given level
235 * (internal).
236 * @param logger_index Logger index
237 * @param level The log level to check
238 * @return True if messages at this level should be logged
239 */
240 [[nodiscard]] bool ShouldLogImpl(LoggerTypeIndex logger_index,
241 Level level) const noexcept;
242
243 /**
244 * @brief Gets the current log level for a logger by index (internal).
245 * @param logger_index Logger index
246 * @return The current log level, or `Level::kTrace` if logger doesn't exist
247 */
248 [[nodiscard]] Level GetLevelImpl(LoggerTypeIndex logger_index) const noexcept;
249
250 static void LogMessageImpl(const std::shared_ptr<spdlog::logger>& logger,
251 Level level, std::string_view message) noexcept;
252
253 [[nodiscard]] auto CreateLogger(std::string_view logger_name,
254 const Config& config) noexcept
255 -> std::shared_ptr<spdlog::logger>;
256
257 static void DropLoggerFromSpdlog(
258 const std::shared_ptr<spdlog::logger>& logger) noexcept;
259
260 std::unordered_map<LoggerTypeIndex, std::shared_ptr<spdlog::logger>> loggers_;
261 std::unordered_map<LoggerTypeIndex, Config> logger_configs_;
262 std::unordered_map<LoggerTypeIndex, Level> logger_levels_;
263 mutable std::shared_mutex loggers_mutex_;
264
265 Config default_config_;
266};
267
268inline Logger::Logger() noexcept {
269 default_config_ = LoggerConfigOf<DefaultLogger>();
270
272 constexpr std::string_view default_name = LoggerNameOf<DefaultLogger>();
273
274 if (auto logger = CreateLogger(default_name, default_config_)) [[likely]] {
275 loggers_.emplace(default_id, std::move(logger));
276 logger_configs_.emplace(default_id, default_config_);
277 logger_levels_.emplace(default_id, Level::kTrace);
278 }
279}
280
281template <LoggerTrait T>
282inline void Logger::AddLogger(T /*logger*/, Config config) noexcept {
283 constexpr LoggerTypeIndex logger_index = LoggerTypeIndex::From<T>();
284 constexpr std::string_view logger_name = LoggerNameOf<T>();
285
286 const std::scoped_lock lock(loggers_mutex_);
287 if (loggers_.contains(logger_index)) [[unlikely]] {
288 return;
289 }
290
291 if (auto spdlog_logger = CreateLogger(logger_name, config)) [[likely]] {
292 loggers_.emplace(logger_index, std::move(spdlog_logger));
293 logger_configs_.emplace(logger_index, std::move(config));
294 logger_levels_.emplace(logger_index, Level::kTrace);
295 }
296}
297
298template <LoggerTrait T>
299inline void Logger::RemoveLogger(T /*logger*/) noexcept {
300 constexpr LoggerTypeIndex logger_index = LoggerTypeIndex::From<T>();
301
302 // Cannot remove the default logger
303 if (logger_index == LoggerTypeIndex::From<DefaultLogger>()) [[unlikely]] {
304 return;
305 }
306
307 const std::scoped_lock lock(loggers_mutex_);
308 if (const auto it = loggers_.find(logger_index); it != loggers_.end()) {
309 // Unregister from spdlog before erasing
310 DropLoggerFromSpdlog(it->second);
311 loggers_.erase(it);
312 logger_configs_.erase(logger_index);
313 logger_levels_.erase(logger_index);
314 }
315}
316
317template <LoggerTrait T>
318inline void Logger::Log(T /*logger*/, Level level,
319 std::string_view message) noexcept {
320 if (auto spdlog_logger = GetLogger(LoggerTypeIndex::From<T>())) [[likely]] {
321 LogMessageImpl(spdlog_logger, level, message);
322 }
323}
324
325template <LoggerTrait T, typename... Args>
326 requires(sizeof...(Args) > 0)
327inline void Logger::Log(T logger, Level level, std::format_string<Args...> fmt,
328 Args&&... args) noexcept {
329 try {
330 const std::string message = std::format(fmt, std::forward<Args>(args)...);
331 Log(logger, level, message);
332 } catch (...) {
333 // Silently ignore formatting errors
334 }
335}
336
337inline void Logger::Log(Level level, std::string_view message) noexcept {
338 if (auto logger = GetDefaultLogger()) [[likely]] {
339 LogMessageImpl(logger, level, message);
340 }
341}
342
343template <typename... Args>
344 requires(sizeof...(Args) > 0)
345inline void Logger::Log(Level level, std::format_string<Args...> fmt,
346 Args&&... args) noexcept {
347 try {
348 const std::string message = std::format(fmt, std::forward<Args>(args)...);
349 Log(level, message);
350 } catch (...) {
351 // Silently ignore formatting errors
352 }
353}
354
355template <LoggerTrait T>
356inline bool Logger::HasLogger(T /*logger*/) const noexcept {
357 const std::shared_lock lock(loggers_mutex_);
358 return loggers_.contains(LoggerTypeIndex::From<T>());
359}
360
361#if defined(HELIOS_DEBUG_MODE) || defined(HELIOS_RELEASE_WITH_DEBUG_INFO_MODE)
362/**
363 * @brief Logs a debug message with the default logger.
364 * @param message The message to log
365 */
366inline void Debug(std::string_view message) noexcept {
368}
369
370template <typename... Args>
371 requires(sizeof...(Args) > 0)
372/**
373 * @brief Logs a formatted debug message with the default logger.
374 * @tparam Args Types of the format arguments
375 * @param fmt Format string
376 * @param args Arguments for the format string
377 */
378inline void Debug(std::format_string<Args...> fmt, Args&&... args) noexcept {
379 Logger::Instance().Log(Level::kDebug, fmt, std::forward<Args>(args)...);
380}
381
382/**
383 * @brief Logs a debug message with the specified logger.
384 * @tparam T Logger type
385 * @param logger Logger type instance
386 * @param message The message to log
387 */
388template <LoggerTrait T>
389inline void Debug(T logger, std::string_view message) noexcept {
390 Logger::Instance().Log(logger, Level::kDebug, message);
391}
392
393/**
394 * @brief Logs a formatted debug message with the specified logger.
395 * @tparam T Logger type
396 * @tparam Args Types of the format arguments
397 * @param logger Logger type instance
398 * @param fmt Format string
399 * @param args Arguments for the format string
400 */
401template <LoggerTrait T, typename... Args>
402 requires(sizeof...(Args) > 0)
403inline void Debug(T logger, std::format_string<Args...> fmt,
404 Args&&... args) noexcept {
405 Logger::Instance().Log(logger, Level::kDebug, fmt,
406 std::forward<Args>(args)...);
407}
408
409/**
410 * @brief Logs a trace message with the default logger.
411 * @param message The message to log
412 */
413inline void Trace(std::string_view message) noexcept {
415}
416
417/**
418 * @brief Logs a formatted trace message with the default logger.
419 * @tparam Args Types of the format arguments
420 * @param fmt Format string
421 * @param args Arguments for the format string
422 */
423template <typename... Args>
424 requires(sizeof...(Args) > 0)
425inline void Trace(std::format_string<Args...> fmt, Args&&... args) noexcept {
426 Logger::Instance().Log(Level::kTrace, fmt, std::forward<Args>(args)...);
427}
428
429/**
430 * @brief Logs a trace message with the specified logger.
431 * @tparam T Logger type
432 * @param logger Logger type instance
433 * @param message The message to log
434 */
435template <LoggerTrait T>
436inline void Trace(T logger, std::string_view message) noexcept {
437 Logger::Instance().Log(logger, Level::kTrace, message);
438}
439
440/**
441 * @brief Logs a formatted trace message with the specified logger.
442 * @tparam T Logger type
443 * @tparam Args Types of the format arguments
444 * @param logger Logger type instance
445 * @param fmt Format string
446 * @param args Arguments for the format string
447 */
448template <LoggerTrait T, typename... Args>
449 requires(sizeof...(Args) > 0)
450inline void Trace(T logger, std::format_string<Args...> fmt,
451 Args&&... args) noexcept {
452 Logger::Instance().Log(logger, Level::kTrace, fmt,
453 std::forward<Args>(args)...);
454}
455#else
456inline void Trace(std::string_view /*message*/) noexcept {}
457
458template <typename... Args>
459inline void Trace(Args&&... /*args*/) noexcept {}
460
461template <LoggerTrait T>
462inline void Trace(T /*logger*/, std::string_view /*message*/) noexcept {}
463
464template <LoggerTrait T, typename... Args>
465inline void Trace(T /*logger*/, Args&&... /*args*/) noexcept {}
466
467inline void Debug(std::string_view /*message*/) noexcept {}
468
469template <typename... Args>
470inline void Debug(Args&&... /*args*/) noexcept {}
471
472template <LoggerTrait T>
473inline void Debug(T /*logger*/, std::string_view /*message*/) noexcept {}
474
475template <LoggerTrait T, typename... Args>
476inline void Debug(T /*logger*/, Args&&... /*args*/) noexcept {}
477#endif
478
479/**
480 * @brief Logs an info message with the default logger.
481 * @param message The message to log
482 */
483inline void Info(std::string_view message) noexcept {
485}
486
487/**
488 * @brief Logs a formatted info message with the default logger.
489 * @tparam Args Types of the format arguments
490 * @param fmt Format string
491 * @param args Arguments for the format string
492 */
493template <typename... Args>
494 requires(sizeof...(Args) > 0)
495inline void Info(std::format_string<Args...> fmt, Args&&... args) noexcept {
496 Logger::Instance().Log(Level::kInfo, fmt, std::forward<Args>(args)...);
497}
498
499/**
500 * @brief Logs an info message with the specified logger.
501 * @tparam T Logger type
502 * @param logger Logger type instance
503 * @param message The message to log
504 */
505template <LoggerTrait T>
506inline void Info(T logger, std::string_view message) noexcept {
507 Logger::Instance().Log(logger, Level::kInfo, message);
508}
509
510/**
511 * @brief Logs a formatted info message with the specified logger.
512 * @tparam T Logger type
513 * @tparam Args Types of the format arguments
514 * @param logger Logger type instance
515 * @param fmt Format string
516 * @param args Arguments for the format string
517 */
518template <LoggerTrait T, typename... Args>
519 requires(sizeof...(Args) > 0)
520inline void Info(T logger, std::format_string<Args...> fmt,
521 Args&&... args) noexcept {
522 Logger::Instance().Log(logger, Level::kInfo, fmt,
523 std::forward<Args>(args)...);
524}
525
526/**
527 * @brief Logs a warning message with the default logger.
528 * @param message The message to log
529 */
530inline void Warn(std::string_view message) noexcept {
532}
533
534/**
535 * @brief Logs a formatted warning message with the default logger.
536 * @tparam Args Types of the format arguments
537 * @param fmt Format string
538 * @param args Arguments for the format string
539 */
540template <typename... Args>
541 requires(sizeof...(Args) > 0)
542inline void Warn(std::format_string<Args...> fmt, Args&&... args) noexcept {
543 Logger::Instance().Log(Level::kWarn, fmt, std::forward<Args>(args)...);
544}
545
546/**
547 * @brief Logs a warning message with the specified logger.
548 * @tparam T Logger type
549 * @param logger Logger type instance
550 * @param message The message to log
551 */
552template <LoggerTrait T>
553inline void Warn(T logger, std::string_view message) noexcept {
554 Logger::Instance().Log(logger, Level::kWarn, message);
555}
556
557/**
558 * @brief Logs a formatted warning message with the specified logger.
559 * @tparam T Logger type
560 * @tparam Args Types of the format arguments
561 * @param logger Logger type instance
562 * @param fmt Format string
563 * @param args Arguments for the format string
564 */
565template <LoggerTrait T, typename... Args>
566 requires(sizeof...(Args) > 0)
567inline void Warn(T logger, std::format_string<Args...> fmt,
568 Args&&... args) noexcept {
569 Logger::Instance().Log(logger, Level::kWarn, fmt,
570 std::forward<Args>(args)...);
571}
572
573/**
574 * @brief Logs an error message with the default logger.
575 * @param message The message to log
576 */
577inline void Error(std::string_view message) noexcept {
579}
580
581/**
582 * @brief Logs a formatted error message with the default logger.
583 * @tparam Args Types of the format arguments
584 * @param fmt Format string
585 * @param args Arguments for the format string
586 */
587template <typename... Args>
588 requires(sizeof...(Args) > 0)
589inline void Error(std::format_string<Args...> fmt, Args&&... args) noexcept {
590 Logger::Instance().Log(Level::kError, fmt, std::forward<Args>(args)...);
591}
592
593/**
594 * @brief Logs an error message with the specified logger.
595 * @tparam T Logger type
596 * @param logger Logger type instance
597 * @param message The message to log
598 */
599template <LoggerTrait T>
600inline void Error(T logger, std::string_view message) noexcept {
601 Logger::Instance().Log(logger, Level::kError, message);
602}
603
604/**
605 * @brief Logs a formatted error message with the specified logger.
606 * @tparam T Logger type
607 * @tparam Args Types of the format arguments
608 * @param logger Logger type instance
609 * @param fmt Format string
610 * @param args Arguments for the format string
611 */
612template <LoggerTrait T, typename... Args>
613 requires(sizeof...(Args) > 0)
614inline void Error(T logger, std::format_string<Args...> fmt,
615 Args&&... args) noexcept {
616 Logger::Instance().Log(logger, Level::kError, fmt,
617 std::forward<Args>(args)...);
618}
619
620/**
621 * @brief Logs a critical message with the default logger.
622 * @param message The message to log
623 */
624inline void Critical(std::string_view message) noexcept {
626}
627
628/**
629 * @brief Logs a formatted critical message with the default logger.
630 * @tparam Args Types of the format arguments
631 * @param fmt Format string
632 * @param args Arguments for the format string
633 */
634template <typename... Args>
635 requires(sizeof...(Args) > 0)
636inline void Critical(std::format_string<Args...> fmt, Args&&... args) noexcept {
637 Logger::Instance().Log(Level::kCritical, fmt, std::forward<Args>(args)...);
638}
639
640/**
641 * @brief Logs a critical message with the specified logger.
642 * @tparam T Logger type
643 * @param logger Logger type instance
644 * @param message The message to log
645 */
646template <LoggerTrait T>
647inline void Critical(T logger, std::string_view message) noexcept {
648 Logger::Instance().Log(logger, Level::kCritical, message);
649}
650
651/**
652 * @brief Logs a formatted critical message with the specified logger.
653 * @tparam T Logger type
654 * @tparam Args Types of the format arguments
655 * @param logger Logger type instance
656 * @param fmt Format string
657 * @param args Arguments for the format string
658 */
659template <LoggerTrait T, typename... Args>
660 requires(sizeof...(Args) > 0)
661inline void Critical(T logger, std::format_string<Args...> fmt,
662 Args&&... args) noexcept {
664 std::forward<Args>(args)...);
665}
666
667} // namespace helios::log
668
669// This provides the assertion handler integration that the utils plugin's
670// assert.hpp uses. Priority order for assertion handling:
671// 1. Custom user handler (set via helios::SetAssertionHandler)
672// 2. Log plugin handler (this - when log plugin is linked)
673// 3. Default handler (printf/println to stderr)
674//
675// The actual symbol definitions are in logger.cpp to properly override
676// the weak symbols from assert.cpp. This header only declares the
677// implementation function used by logger.cpp.
678
680
681/**
682 * @brief Log plugin assertion handler implementation.
683 * @details Logs the assertion failure via the log system with critical level.
684 * This is called by the weak symbol overrides in logger.cpp.
685 */
686void LogAssertionViaLogger(std::string_view condition,
687 const std::source_location& loc,
688 std::string_view message) noexcept;
689
690} // namespace helios::log::details
Level GetLevel() const noexcept
Gets the current log level for the default logger.
Definition logger.cpp:136
void Flush(T={}) noexcept
Flushes a specific logger.
Definition logger.hpp:85
Logger(Logger &&)=delete
static Logger & Instance() noexcept
Gets the singleton instance.
Definition logger.hpp:53
void RemoveLogger(T logger={}) noexcept
Removes a logger with the given type.
Definition logger.hpp:299
bool ShouldLog(T, Level level) const noexcept
Checks if a typed logger should log messages at the given level.
Definition logger.hpp:181
Level GetLevel(T={}) const noexcept
Gets the current log level for a typed logger.
Definition logger.hpp:192
void Log(T logger, Level level, std::string_view message) noexcept
Logs a string message with typed logger.
Definition logger.hpp:318
Logger(const Logger &)=delete
void FlushAll() noexcept
Flushes all registered loggers.
Definition logger.cpp:98
void SetLevel(T, Level level) noexcept
Sets the minimum log level for a typed logger.
Definition logger.hpp:147
~Logger() noexcept=default
void SetDefaultConfig(const Config &config) noexcept
Sets the global default configuration for new loggers.
Definition logger.hpp:136
const Config & GetDefaultConfig() const noexcept
Gets the current default configuration.
Definition logger.hpp:206
bool ShouldLog(Level level) const noexcept
Checks if the default logger should log messages at the given level.
Definition logger.cpp:128
void AddLogger(T logger, Config config=LoggerConfigOf< T >()) noexcept
Adds a logger with the specified type and configuration.
Definition logger.hpp:282
bool HasLogger(T logger={}) const noexcept
Checks if a logger with the given type exists.
Definition logger.hpp:356
static constexpr TypeIndex From() noexcept
Constructs a TypeIndex from a type T.
Trait to identify valid logger types.
Definition config.hpp:115
void LogAssertionViaLogger(std::string_view condition, const std::source_location &loc, std::string_view message) noexcept
Log plugin assertion handler implementation.
Definition logger.cpp:297
constexpr DefaultLogger kDefaultLogger
Constexpr instance of the default logger for easier user interface.
Definition logger.hpp:34
void Warn(std::string_view message) noexcept
Logs a warning message with the default logger.
Definition logger.hpp:530
utils::TypeIndex LoggerTypeIndex
Type alias for logger type indices.
Definition config.hpp:98
void Error(std::string_view message) noexcept
Logs an error message with the default logger.
Definition logger.hpp:577
void Debug(std::string_view) noexcept
Definition logger.hpp:467
void Info(std::string_view message) noexcept
Logs an info message with the default logger.
Definition logger.hpp:483
constexpr Config LoggerConfigOf(T={}) noexcept
Gets the configuration for a logger type.
Definition config.hpp:181
constexpr std::string_view LoggerNameOf(T={}) noexcept
Gets the name of a logger type.
Definition config.hpp:158
void Critical(std::string_view message) noexcept
Logs a critical message with the default logger.
Definition logger.hpp:624
Level
Log severity levels.
Definition config.hpp:14
void Trace(std::string_view) noexcept
Definition logger.hpp:456
STL namespace.
Configuration for logger behavior and output.
Definition config.hpp:24
static constexpr Config Debug() noexcept
Creates configuration optimized for debug builds.
Definition config.hpp:77
static constexpr Config Release() noexcept
Creates configuration optimized for release builds.
Definition config.hpp:88
Default logger type.
Definition logger.hpp:24
static constexpr auto kConfig
Definition logger.hpp:29
static constexpr std::string_view kName
Definition logger.hpp:25