Helios Engine 0.1.0
A modular ECS based data-oriented C++23 game engine
 
Loading...
Searching...
No Matches
helios::Logger Class Reference

Centralized logging system with configurable output and formatting. More...

#include <logger.hpp>

Public Member Functions

 Logger (const Logger &)=delete
 
 Logger (Logger &&)=delete
 
 ~Logger () noexcept=default
 
Loggeroperator= (const Logger &)=delete
 
Loggeroperator= (Logger &&)=delete
 
template<LoggerTrait T>
void AddLogger (T logger, LoggerConfig config=LoggerConfigOf< T >()) noexcept
 Adds a logger with the specified type and configuration.
 
template<LoggerTrait T>
void RemoveLogger (T logger={}) noexcept
 Removes a logger with the given type.
 
void FlushAll () noexcept
 Flushes all registered loggers.
 
template<LoggerTrait T>
void Flush (T logger={}) noexcept
 Flushes a specific logger.
 
template<LoggerTrait T>
void LogMessage (T logger, LogLevel level, const std::source_location &loc, std::string_view message) noexcept
 Logs a string message with typed logger.
 
template<LoggerTrait T, typename... Args>
requires (sizeof...(Args) > 0)
void LogMessage (T logger, LogLevel level, const std::source_location &loc, std::format_string< Args... > fmt, Args &&... args) noexcept
 Logs a formatted message with typed logger.
 
void LogMessage (LogLevel level, const std::source_location &loc, std::string_view message) noexcept
 Logs a string message with default logger.
 
template<typename... Args>
requires (sizeof...(Args) > 0)
void LogMessage (LogLevel level, const std::source_location &loc, std::format_string< Args... > fmt, Args &&... args) noexcept
 Logs a formatted message with default logger.
 
template<LoggerTrait T>
void LogAssertionFailure (T logger, std::string_view condition, const std::source_location &loc, std::string_view message) noexcept
 Logs assertion failure with typed logger.
 
template<LoggerTrait T, typename... Args>
requires (sizeof...(Args) > 0)
void LogAssertionFailure (T logger, std::string_view condition, const std::source_location &loc, std::format_string< Args... > fmt, Args &&... args) noexcept
 Logs assertion failure with typed logger (formatted).
 
void LogAssertionFailure (std::string_view condition, const std::source_location &loc, std::string_view message) noexcept
 Logs assertion failure with default logger.
 
template<typename... Args>
requires (sizeof...(Args) > 0)
void LogAssertionFailure (std::string_view condition, const std::source_location &loc, std::format_string< Args... > fmt, Args &&... args) noexcept
 Logs assertion failure with default logger (formatted).
 
void SetDefaultConfig (const LoggerConfig &config) noexcept
 Sets the global default configuration for new loggers.
 
template<LoggerTrait T>
void SetLevel (T logger, LogLevel level) noexcept
 Sets the minimum log level for a typed logger.
 
void SetLevel (LogLevel level) noexcept
 Sets the minimum log level for the default logger.
 
template<LoggerTrait T>
bool HasLogger (T logger={}) const noexcept
 Checks if a logger with the given type exists.
 
bool ShouldLog (LogLevel level) const noexcept
 Checks if the default logger should log messages at the given level.
 
template<LoggerTrait T>
bool ShouldLog (T logger, LogLevel level) const noexcept
 Checks if a typed logger should log messages at the given level.
 
template<LoggerTrait T>
LogLevel GetLevel (T logger={}) const noexcept
 Gets the current log level for a typed logger.
 
LogLevel GetLevel () const noexcept
 Gets the current log level for the default logger.
 
const LoggerConfigGetDefaultConfig () const noexcept
 Gets the current default configuration.
 

Static Public Member Functions

static LoggerGetInstance () noexcept
 Gets the singleton instance.
 

Detailed Description

Centralized logging system with configurable output and formatting.

Note
Thread-safe.

Definition at line 231 of file logger.hpp.

Constructor & Destructor Documentation

◆ Logger() [1/2]

helios::Logger::Logger ( const Logger )
delete

◆ Logger() [2/2]

helios::Logger::Logger ( Logger &&  )
delete

◆ ~Logger()

Member Function Documentation

◆ AddLogger()

template<LoggerTrait T>
void helios::Logger::AddLogger ( logger,
LoggerConfig  config = LoggerConfigOf<T>() 
)
inlinenoexcept

Adds a logger with the specified type and configuration.

Template Parameters
TLogger type
Parameters
loggerLogger type instance
configConfiguration for the logger
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 521 of file logger.hpp.

521 {
522 constexpr LoggerId logger_id = LoggerIdOf<T>();
523 constexpr std::string_view logger_name = LoggerNameOf<T>();
524
525 const std::scoped_lock lock(loggers_mutex_);
526 if (loggers_.contains(logger_id)) [[unlikely]] {
527 return;
528 }
529
530 if (auto spdlog_logger = CreateLogger(logger_name, config)) [[likely]] {
531 loggers_.emplace(logger_id, std::move(spdlog_logger));
532 logger_configs_.emplace(logger_id, std::move(config));
533 logger_levels_.emplace(logger_id, LogLevel::kTrace);
534 }
535}
size_t LoggerId
Type alias for logger type IDs.
Definition logger.hpp:106

◆ Flush()

template<LoggerTrait T>
void helios::Logger::Flush ( logger = {})
inlinenoexcept

Flushes a specific logger.

Template Parameters
TLogger type
Parameters
loggerLogger type instance
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 269 of file logger.hpp.

269 {}) noexcept {
270 FlushImpl(LoggerIdOf<T>());
271 }

◆ FlushAll()

void helios::Logger::FlushAll ( )
noexcept

Flushes all registered loggers.

Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 304 of file logger.cpp.

304 {
305 const std::shared_lock lock(loggers_mutex_);
306 for (const auto& [_, logger] : loggers_) {
307 if (logger) [[likely]] {
308 try {
309 logger->flush();
310 } catch (...) {
311 // Silently ignore flush errors
312 }
313 }
314 }
315}

◆ GetDefaultConfig()

const LoggerConfig & helios::Logger::GetDefaultConfig ( ) const
inlinenoexcept

Gets the current default configuration.

Returns
The default logger configuration
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 441 of file logger.hpp.

441{ return default_config_; }

◆ GetInstance()

static Logger & helios::Logger::GetInstance ( )
inlinestaticnoexcept

Gets the singleton instance.

Returns
Reference to the Logger instance
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 447 of file logger.hpp.

447 {
448 static Logger instance;
449 return instance;
450 }
Logger(const Logger &)=delete

◆ GetLevel() [1/2]

LogLevel helios::Logger::GetLevel ( ) const
noexcept

Gets the current log level for the default logger.

Returns
The current log level
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 340 of file logger.cpp.

340 {
341 if (const auto logger = GetDefaultLogger()) [[likely]] {
342 return static_cast<LogLevel>(logger->level());
343 }
344 return LogLevel::kTrace;
345}
LogLevel
Log severity levels.
Definition logger.hpp:34

◆ GetLevel() [2/2]

template<LoggerTrait T>
LogLevel helios::Logger::GetLevel ( logger = {}) const
inlinenoexcept

Gets the current log level for a typed logger.

Template Parameters
TLogger type
Parameters
loggerLogger type instance
Returns
The current log level, or LogLevel::kTrace if logger doesn't exist

Definition at line 427 of file logger.hpp.

427 {}) const noexcept {
428 return GetLevelImpl(LoggerIdOf<T>());
429 }

◆ HasLogger()

template<LoggerTrait T>
bool helios::Logger::HasLogger ( logger = {}) const
inlinenoexcept

Checks if a logger with the given type exists.

Template Parameters
TLogger type
Parameters
loggerLogger type instance
Returns
True if the logger exists, false otherwise
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 636 of file logger.hpp.

636 {
637 const std::shared_lock lock(loggers_mutex_);
638 return loggers_.contains(LoggerIdOf<T>());
639}

◆ LogAssertionFailure() [1/4]

template<typename... Args>
requires (sizeof...(Args) > 0)
void helios::Logger::LogAssertionFailure ( std::string_view  condition,
const std::source_location &  loc,
std::format_string< Args... >  fmt,
Args &&...  args 
)
inlinenoexcept

Logs assertion failure with default logger (formatted).

Template Parameters
ArgsTypes of the format arguments
Parameters
conditionThe failed condition as a string
locSource location where the assertion failed
fmtFormat string for the failure message
argsArguments for the format string

Definition at line 625 of file logger.hpp.

626 {
627 try {
628 const std::string message = std::format(fmt, std::forward<Args>(args)...);
629 LogAssertionFailure(condition, loc, message);
630 } catch (...) {
631 LogAssertionFailure(condition, loc, "Formatting error in assertion message");
632 }
633}
void LogAssertionFailure(T logger, std::string_view condition, const std::source_location &loc, std::string_view message) noexcept
Logs assertion failure with typed logger.
Definition logger.hpp:595

◆ LogAssertionFailure() [2/4]

void helios::Logger::LogAssertionFailure ( std::string_view  condition,
const std::source_location &  loc,
std::string_view  message 
)
inlinenoexcept

Logs assertion failure with default logger.

Parameters
conditionThe failed condition as a string
locSource location where the assertion failed
messageAdditional message describing the failure

Definition at line 616 of file logger.hpp.

617 {
618 if (auto logger = GetDefaultLogger()) [[likely]] {
619 LogAssertionFailureImpl(logger, condition, loc, message);
620 }
621}

◆ LogAssertionFailure() [3/4]

template<LoggerTrait T, typename... Args>
requires (sizeof...(Args) > 0)
void helios::Logger::LogAssertionFailure ( logger,
std::string_view  condition,
const std::source_location &  loc,
std::format_string< Args... >  fmt,
Args &&...  args 
)
inlinenoexcept

Logs assertion failure with typed logger (formatted).

Template Parameters
TLogger type
ArgsTypes of the format arguments
Parameters
loggerLogger type instance
conditionThe failed condition as a string
locSource location where the assertion failed
fmtFormat string for the failure message
argsArguments for the format string

Definition at line 606 of file logger.hpp.

607 {
608 try {
609 const std::string message = std::format(fmt, std::forward<Args>(args)...);
610 LogAssertionFailure(logger, condition, loc, message);
611 } catch (...) {
612 LogAssertionFailure(logger, condition, loc, "Formatting error in assertion message");
613 }
614}

◆ LogAssertionFailure() [4/4]

template<LoggerTrait T>
void helios::Logger::LogAssertionFailure ( logger,
std::string_view  condition,
const std::source_location &  loc,
std::string_view  message 
)
inlinenoexcept

Logs assertion failure with typed logger.

Template Parameters
TLogger type
Parameters
loggerLogger type instance
conditionThe failed condition as a string
locSource location where the assertion failed
messageAdditional message describing the failure
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 595 of file logger.hpp.

596 {
597 if (auto spdlog_logger = GetLogger(LoggerIdOf<T>())) [[likely]] {
598 LogAssertionFailureImpl(spdlog_logger, condition, loc, message);
599 } else if (auto default_logger = GetDefaultLogger()) [[likely]] {
600 LogAssertionFailureImpl(default_logger, condition, loc, message);
601 }
602}

◆ LogMessage() [1/4]

template<typename... Args>
requires (sizeof...(Args) > 0)
void helios::Logger::LogMessage ( LogLevel  level,
const std::source_location &  loc,
std::format_string< Args... >  fmt,
Args &&...  args 
)
inlinenoexcept

Logs a formatted message with default logger.

Template Parameters
ArgsTypes of the format arguments
Parameters
levelLog severity level
locSource location where the log was triggered
fmtFormat string
argsArguments for the format string

Definition at line 584 of file logger.hpp.

585 {
586 try {
587 const std::string message = std::format(fmt, std::forward<Args>(args)...);
588 LogMessage(level, loc, message);
589 } catch (...) {
590 // Silently ignore formatting errors
591 }
592}
void LogMessage(T logger, LogLevel level, const std::source_location &loc, std::string_view message) noexcept
Logs a string message with typed logger.
Definition logger.hpp:557

◆ LogMessage() [2/4]

void helios::Logger::LogMessage ( LogLevel  level,
const std::source_location &  loc,
std::string_view  message 
)
inlinenoexcept

Logs a string message with default logger.

Parameters
levelLog severity level
locSource location where the log was triggered
messageMessage to log

Definition at line 576 of file logger.hpp.

576 {
577 if (auto logger = GetDefaultLogger()) [[likely]] {
578 LogMessageImpl(logger, level, loc, message);
579 }
580}

◆ LogMessage() [3/4]

template<LoggerTrait T, typename... Args>
requires (sizeof...(Args) > 0)
void helios::Logger::LogMessage ( logger,
LogLevel  level,
const std::source_location &  loc,
std::format_string< Args... >  fmt,
Args &&...  args 
)
inlinenoexcept

Logs a formatted message with typed logger.

Template Parameters
TLogger type
ArgsTypes of the format arguments
Parameters
loggerLogger type instance
levelLog severity level
locSource location where the log was triggered
fmtFormat string
argsArguments for the format string

Definition at line 566 of file logger.hpp.

567 {
568 try {
569 const std::string message = std::format(fmt, std::forward<Args>(args)...);
570 LogMessage(logger, level, loc, message);
571 } catch (...) {
572 // Silently ignore formatting errors
573 }
574}

◆ LogMessage() [4/4]

template<LoggerTrait T>
void helios::Logger::LogMessage ( logger,
LogLevel  level,
const std::source_location &  loc,
std::string_view  message 
)
inlinenoexcept

Logs a string message with typed logger.

Template Parameters
TLogger type
Parameters
loggerLogger type instance
levelLog severity level
locSource location where the log was triggered
messageMessage to log
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 557 of file logger.hpp.

558 {
559 if (auto spdlog_logger = GetLogger(LoggerIdOf<T>())) [[likely]] {
560 LogMessageImpl(spdlog_logger, level, loc, message);
561 }
562}

◆ operator=() [1/2]

Logger & helios::Logger::operator= ( const Logger )
delete

◆ operator=() [2/2]

Logger & helios::Logger::operator= ( Logger &&  )
delete

◆ RemoveLogger()

template<LoggerTrait T>
void helios::Logger::RemoveLogger ( logger = {})
inlinenoexcept

Removes a logger with the given type.

Note
Cannot remove the default logger
Template Parameters
TLogger type
Parameters
loggerLogger type instance
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 538 of file logger.hpp.

538 {
539 constexpr LoggerId logger_id = LoggerIdOf<T>();
540
541 // Cannot remove the default logger
542 if (logger_id == LoggerIdOf<DefaultLogger>()) [[unlikely]] {
543 return;
544 }
545
546 const std::scoped_lock lock(loggers_mutex_);
547 if (const auto it = loggers_.find(logger_id); it != loggers_.end()) {
548 // Unregister from spdlog before erasing
549 DropLoggerFromSpdlog(it->second);
550 loggers_.erase(it);
551 logger_configs_.erase(logger_id);
552 logger_levels_.erase(logger_id);
553 }
554}

◆ SetDefaultConfig()

void helios::Logger::SetDefaultConfig ( const LoggerConfig config)
inlinenoexcept

Sets the global default configuration for new loggers.

Parameters
configThe configuration to use as default
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 373 of file logger.hpp.

373{ default_config_ = config; }

◆ SetLevel() [1/2]

void helios::Logger::SetLevel ( LogLevel  level)
noexcept

Sets the minimum log level for the default logger.

Parameters
levelMinimum log level to set

Definition at line 327 of file logger.cpp.

327 {
328 if (const auto logger = GetDefaultLogger()) [[likely]] {
329 logger->set_level(static_cast<spdlog::level::level_enum>(std::to_underlying(level)));
330 }
331}

◆ SetLevel() [2/2]

template<LoggerTrait T>
void helios::Logger::SetLevel ( logger,
LogLevel  level 
)
inlinenoexcept

Sets the minimum log level for a typed logger.

Template Parameters
TLogger type
Parameters
loggerLogger type instance
levelMinimum log level to set
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 382 of file logger.hpp.

382 {
383 SetLevelImpl(LoggerIdOf<T>(), level);
384 }

◆ ShouldLog() [1/2]

bool helios::Logger::ShouldLog ( LogLevel  level) const
noexcept

Checks if the default logger should log messages at the given level.

Parameters
levelThe log level to check
Returns
True if messages at this level should be logged
Examples
/home/runner/work/HeliosEngine/HeliosEngine/src/core/include/helios/core/logger.hpp.

Definition at line 333 of file logger.cpp.

333 {
334 if (const auto logger = GetDefaultLogger()) [[likely]] {
335 return logger->should_log(static_cast<spdlog::level::level_enum>(std::to_underlying(level)));
336 }
337 return false;
338}

◆ ShouldLog() [2/2]

template<LoggerTrait T>
bool helios::Logger::ShouldLog ( logger,
LogLevel  level 
) const
inlinenoexcept

Checks if a typed logger should log messages at the given level.

Template Parameters
TLogger type
Parameters
loggerLogger type instance
levelThe log level to check
Returns
True if messages at this level should be logged

Definition at line 416 of file logger.hpp.

416 {
417 return ShouldLogImpl(LoggerIdOf<T>(), level);
418 }