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)
85 spdlog::init_thread_pool(queueSize, numThreads);
86 std::vector<spdlog::sink_ptr> sinks;
89 auto consoleSink = std::make_shared<
90 spdlog::sinks::stdout_color_sink_mt>();
91 consoleSink->set_level(globalLevel);
92 sinks.push_back(consoleSink);
96 std::string timestampedPath
98 auto fileSink = std::make_shared<
99 spdlog::sinks::rotating_file_sink_mt>(
100 timestampedPath, maxFileSize, maxFiles);
101 fileSink->set_level(globalLevel);
102 sinks.push_back(fileSink);
106 sinks.push_back(customSink);
110 throw std::runtime_error(
111 "Logger requires at least one sink (file or console).");
114 auto asyncLogger = std::make_shared<spdlog::async_logger>(
115 loggerName, sinks.begin(), sinks.end(),
116 spdlog::thread_pool(),
117 spdlog::async_overflow_policy::block);
119 asyncLogger->set_level(globalLevel);
120 asyncLogger->set_pattern(
121 "[%Y-%m-%d %H:%M:%S.%e] [t %t] [%^%l%$] [%s:%#] %v");
123 spdlog::register_logger(asyncLogger);
124 spdlog::set_default_logger(asyncLogger);
125 spdlog::set_level(globalLevel);
126 spdlog::set_error_handler([](
const std::string& msg) {
127 fprintf(stderr,
"SPDLOG INTERNAL ERROR: %s\n", msg.c_str());