Files
m2dev-server-src/src/libthecore/log.cpp
2025-09-22 04:18:39 +02:00

116 lines
2.6 KiB
C++

#include "log.h"
#include <cstdarg>
#include <fstream>
#include <filesystem>
#include <chrono>
#include <iomanip>
#include <ctime>
#include <spdlog/spdlog.h>
#include <spdlog/async.h>
#include <spdlog/sinks/basic_file_sink.h>
#include "syslog_rotate_sink.h"
constexpr size_t LOGGER_QUEUE_SIZE = (1 << 14);
constexpr size_t LOGGER_NUM_THREADS = 1;
static std::shared_ptr<spdlog::logger> g_syslog;
static std::shared_ptr<spdlog::logger> 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_rotate_sink>();
syslog_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] %v");
g_syslog = std::make_shared<spdlog::async_logger>(
"syslog",
syslog_sink,
spdlog::thread_pool(),
spdlog::async_overflow_policy::block);
spdlog::register_logger(g_syslog);
auto syserr_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("syserr.log", true);
syserr_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [%!()] %v");
g_syserr = std::make_shared<spdlog::async_logger>(
"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) };
}