28 auto now = std::chrono::system_clock::now();
29 auto time = std::chrono::system_clock::to_time_t(now);
32 ss << std::put_time(std::localtime(&time),
"%Y-%m-%d_%H-%M-%S");
35 size_t lastSlash = baseLogPath.find_last_of(
"/\\");
36 size_t lastDot = baseLogPath.find_last_of(
'.');
39 = (lastSlash != std::string::npos)
40 ? baseLogPath.substr(0, lastSlash + 1)
42 std::string filename = (lastSlash != std::string::npos)
43 ? baseLogPath.substr(lastSlash + 1)
46 = (lastDot != std::string::npos && lastDot > lastSlash)
47 ? baseLogPath.substr(lastDot)
50 = (lastDot != std::string::npos && lastDot > lastSlash)
51 ? filename.substr(0, lastDot - (lastSlash + 1))
54 return directory + basename +
"_" + ss.str() + extension;
75 Init(
const std::string& loggerName =
"async_logger",
76 const std::string& logFilePath =
"logs/app.log",
77 const bool enableConsole =
true,
const bool enableFile =
true,
78 const spdlog::level::level_enum globalLevel = spdlog::level::trace,
79 const size_t queueSize = 8192,
const size_t numThreads = 1,
80 size_t maxFileSize = 1024 * 1024 * 300,
size_t maxFiles = 5,
81 spdlog::sink_ptr customSink =
nullptr)
83 if (spdlog::get(loggerName)) {
87 static bool threadPoolInitialized =
false;
88 if (!threadPoolInitialized) {
89 spdlog::init_thread_pool(queueSize, numThreads);
90 threadPoolInitialized =
true;
92 std::vector<spdlog::sink_ptr> sinks;
95 auto consoleSink = std::make_shared<
96 spdlog::sinks::stdout_color_sink_mt>();
97 consoleSink->set_level(globalLevel);
98 sinks.push_back(consoleSink);
102 std::string timestampedPath
104 auto fileSink = std::make_shared<
105 spdlog::sinks::rotating_file_sink_mt>(
106 timestampedPath, maxFileSize, maxFiles);
107 fileSink->set_level(globalLevel);
108 sinks.push_back(fileSink);
112 sinks.push_back(customSink);
116 throw std::runtime_error(
117 "Logger requires at least one sink (file or console).");
120 auto asyncLogger = std::make_shared<spdlog::async_logger>(
121 loggerName, sinks.begin(), sinks.end(),
122 spdlog::thread_pool(),
123 spdlog::async_overflow_policy::block);
125 asyncLogger->set_level(globalLevel);
126 asyncLogger->set_pattern(
127 "[%Y-%m-%d %H:%M:%S.%e] [t %t] [%^%l%$] [%s:%#] %v");
129 spdlog::register_logger(asyncLogger);
130 spdlog::set_default_logger(asyncLogger);
131 spdlog::set_level(globalLevel);
132 spdlog::set_error_handler([](
const std::string& msg) {
133 fprintf(stderr,
"SPDLOG INTERNAL ERROR: %s\n", msg.c_str());