#include "log.h" #include #include #include #include #include #include #include #include #include #include "syslog_rotate_sink.h" constexpr size_t LOGGER_QUEUE_SIZE = (1 << 14); constexpr size_t LOGGER_NUM_THREADS = 1; static std::shared_ptr g_syslog; static std::shared_ptr g_syserr; static bool g_bLogInitialized = false; void log_init() { if (g_bLogInitialized) return; spdlog::init_thread_pool(LOGGER_QUEUE_SIZE, LOGGER_NUM_THREADS); auto syslog_sink = std::make_shared(); syslog_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] %v"); g_syslog = std::make_shared( "syslog", syslog_sink, spdlog::thread_pool(), spdlog::async_overflow_policy::block); spdlog::register_logger(g_syslog); auto syserr_sink = std::make_shared("syserr.log", true); syserr_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [%!()] %v"); g_syserr = std::make_shared( "syserr", syserr_sink, spdlog::thread_pool(), spdlog::async_overflow_policy::block); spdlog::register_logger(g_syserr); #ifdef _DEBUG g_syslog->set_level(spdlog::level::debug); #else g_syslog->set_level(spdlog::level::info); #endif spdlog::flush_every(std::chrono::seconds(1)); std::atexit([]() { log_destroy(); }); g_bLogInitialized = true; } void log_destroy() { if (!g_bLogInitialized) return; spdlog::shutdown(); g_bLogInitialized = false; } void _sys_err(std::string_view str, const std::source_location& src_loc) { if (!g_bLogInitialized) return; spdlog::source_loc loc; loc.funcname = src_loc.function_name(); loc.line = src_loc.line(); loc.filename = src_loc.file_name(); g_syserr->log(loc, spdlog::level::err, str); } void _sys_log(int level, std::string_view str) { if (!g_bLogInitialized) return; spdlog::level::level_enum lvl = spdlog::level::info; switch (level) { case 1: lvl = spdlog::level::debug; break; case 2: lvl = spdlog::level::trace; break; case 3: lvl = spdlog::level::trace; break; default: lvl = spdlog::level::info; break; } g_syslog->log(lvl, str); } std::string_view _format(std::string_view fmt, ...) { constexpr int BUFFER_SIZE = 4096; thread_local char buffer[BUFFER_SIZE + 1]; va_list args; va_start(args, fmt); int len = vsnprintf(buffer, BUFFER_SIZE, fmt.data(), args); va_end(args); return { buffer, (std::string_view::size_type) std::clamp(len, 0, BUFFER_SIZE) }; }