SleakEngine 1.0.0
C++23 multi-backend game engine
Loading...
Searching...
No Matches
Logger.cpp
Go to the documentation of this file.
2
3#include <spdlog/async.h>
4#include <spdlog/sinks/basic_file_sink.h>
5#include <spdlog/sinks/stdout_color_sinks.h>
6#include <spdlog/spdlog.h>
7
8#include <Core/OSDef.hpp>
9
10#include <algorithm>
11#include <chrono>
12#include <ctime>
13#include <filesystem>
14#include <vector>
15
16#ifdef PLATFORM_WIN
17#include <Windows.h>
18#define TRACE_COLOR FOREGROUND_BLUE | FOREGROUND_INTENSITY
19#define WARN_COLOR FOREGROUND_RED | FOREGROUND_GREEN
20#define ERROR_COLOR FOREGROUND_RED | FOREGROUND_INTENSITY
21#define CRITIC_COLOR FOREGROUND_RED
22#else
23#define TRACE_COLOR "\033[0;34m"
24#define WARN_COLOR "\033[33m"
25#define ERROR_COLOR "\033[91m"
26#define CRITIC_COLOR "\033[31m"
27#endif
28
29namespace Sleak {
30
31std::shared_ptr<spdlog::logger> Logger::CoreLogger;
32std::shared_ptr<spdlog::logger> Logger::GameLogger;
33
34void Logger::Init(const std::string& ProjectName) {
35 // Create the async thread pool (use 8192 queue size, 1 worker thread)
36 spdlog::init_thread_pool(8192, 1);
37
38 // Set up a shared console sink
39 auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
40 console_sink->set_level(spdlog::level::trace);
41 console_sink->set_color(spdlog::level::trace, TRACE_COLOR);
42 console_sink->set_color(spdlog::level::warn, WARN_COLOR);
43 console_sink->set_color(spdlog::level::err, ERROR_COLOR);
44 console_sink->set_color(spdlog::level::critical, CRITIC_COLOR);
45
46#ifdef DEBUG
47 // Debug: one timestamped log per session under logs/, keep newest 10
48 namespace fs = std::filesystem;
49 std::error_code ec;
50 fs::create_directories("logs", ec);
51
52 std::vector<fs::path> sessions;
53 for (auto& e : fs::directory_iterator("logs", ec))
54 if (e.is_regular_file() && e.path().extension() == ".log" &&
55 e.path().filename() != "latest.log")
56 sessions.push_back(e.path());
57 std::sort(sessions.begin(), sessions.end());
58 while (sessions.size() >= 10) {
59 fs::remove(sessions.front(), ec);
60 sessions.erase(sessions.begin());
61 }
62
63 char stamp[32];
64 std::time_t now = std::time(nullptr);
65 std::strftime(stamp, sizeof(stamp), "%Y%m%d_%H%M%S", std::localtime(&now));
66 std::string logPath = "logs/" + ProjectName + "_" + stamp + ".log";
67
68 auto file_sink =
69 std::make_shared<spdlog::sinks::basic_file_sink_mt>(logPath, true);
70
71#ifndef PLATFORM_WIN
72 // logs/latest.log always points at the current session
73 fs::remove("logs/latest.log", ec);
74 fs::create_symlink(fs::path(logPath).filename(), "logs/latest.log", ec);
75#endif
76#else
77 auto file_sink =
78 std::make_shared<spdlog::sinks::basic_file_sink_mt>("Engine.log", true);
79#endif
80
81 // Combine console + file sinks
82 std::vector<spdlog::sink_ptr> sinks{console_sink, file_sink};
83
84 // Create async loggers
85 CoreLogger = std::make_shared<spdlog::async_logger>(
86 "Sleak Engine", sinks.begin(), sinks.end(), spdlog::thread_pool());
87 GameLogger = std::make_shared<spdlog::async_logger>(
88 ProjectName, sinks.begin(), sinks.end(), spdlog::thread_pool());
89
90 CoreLogger->set_level(spdlog::level::trace);
91 GameLogger->set_level(spdlog::level::trace);
92
93 // Crash-safe: errors flush immediately, everything else every second
94 CoreLogger->flush_on(spdlog::level::err);
95 GameLogger->flush_on(spdlog::level::err);
96 spdlog::flush_every(std::chrono::seconds(1));
97
98 spdlog::register_logger(CoreLogger);
99 spdlog::register_logger(GameLogger);
100}
101
102// Static function to get the logger
103std::shared_ptr<spdlog::logger>& Logger::GetCoreLogger() {
104 static std::shared_ptr<spdlog::logger> CoreLoggerInstance = CoreLogger;
105 return CoreLoggerInstance;
106}
107
108std::shared_ptr<spdlog::logger>& Logger::GetLogger() {
109 static std::shared_ptr<spdlog::logger> GameLoggerInstance = GameLogger;
110 return GameLoggerInstance;
111}
112
113} // namespace Sleak
#define TRACE_COLOR
Definition Logger.cpp:23
#define ERROR_COLOR
Definition Logger.cpp:25
#define CRITIC_COLOR
Definition Logger.cpp:26
#define WARN_COLOR
Definition Logger.cpp:24
static std::shared_ptr< spdlog::logger > & GetLogger()
Logger used by game code.
Definition Logger.cpp:108
static std::shared_ptr< spdlog::logger > & GetCoreLogger()
Logger used by engine code (SLEAK_ENGINE builds).
Definition Logger.cpp:103
static void Init(const std::string &ProjectName)
Creates the console + file sinks and registers both loggers. Call once at startup.
Definition Logger.cpp:34
Root namespace for everything the engine exposes.
Definition Camera.hpp:10