29 std::string Logger::getCurrentTimestamp() noexcept
31 const auto now = std::chrono::system_clock::now();
32 const std::time_t time = std::chrono::system_clock::to_time_t(now);
35 localtime_s(&tm, &time);
37 localtime_r(&time, &tm);
40 std::ostringstream oss;
41 oss << std::put_time(&tm,
"%Y-%m-%d %H:%M:%S");
45 void Logger::log(
const Level level,
const std::string& message,
const std::source_location& location)
noexcept
47 if (level !=
Level::OFF && level >= getLevel())
50 void* callback_user_data =
nullptr;
54 std::scoped_lock lock(_log_mutex);
56 const std::string filename = std::filesystem::path(location.file_name()).filename().string();
57 const std::string file_line = filename +
":" + std::to_string(location.line());
59 std::ostringstream oss;
60 oss <<
"[" << getCurrentTimestamp() <<
"] " <<
"[" << std::setw(7) << std::left <<
getLevelString(level)
61 <<
"] " <<
"[" << std::setw(30) << std::left << file_line <<
"] " << message;
64 std::cerr << line <<
'\n';
66 if (_log_file && _log_file->is_open())
68 *_log_file << line <<
'\n';
73 callback_user_data = _callback_user_data;
76 if (callback !=
nullptr)
78 callback(level, line, callback_user_data);
85 std::scoped_lock lock(_log_mutex);
87 _callback_user_data = user_data;
92 std::scoped_lock lock(_log_mutex);
94 std::ofstream file(filePath, std::ios::out | std::ios::trunc);
97 return std::unexpected(
"Unable to open log file: " + filePath);
100 _log_file = std::move(file);
Enum class representing the log levels.
Thread-safe logger class for handling logging operations.
void log(Level level, const std::string &message, const std::source_location &location=std::source_location::current()) noexcept
Logs a message with a specific log level and source location.
std::expected< void, std::string > logToFile(const std::string &filePath) noexcept
Sets the log file path to log messages to a file.
void setCallback(Callback callback, void *user_data) noexcept
Sets an optional callback that receives each formatted log line.
void setLevel(Level level) noexcept
Sets the logging level.
void(*)(Level level, const std::string &line, void *user_data) Callback
Level getLevel() const noexcept
Gets the current logging level.
Header file for the logging system.
@ OFF
Special level to disable all logging.
std::string getLevelString(const Level level) noexcept
Converts a log level enum value to its string representation.
Logger logger
Externally available logger object.