Files

70 lines
3.1 KiB
C++
Raw Permalink Normal View History

2026-04-09 19:38:56 +08:00
#pragma once
#include <spdlog/spdlog.h>
#include <spdlog/async.h>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/details/thread_pool.h> // 新增引入thread_pool所在头文件
#include <memory>
#include <string>
#include <vector> // 新增用于sink向量转换避免编译报错
// 单例模式封装 logger全局唯一支持多模块、局部级别、异步输出
class Logger {
public:
// 禁止拷贝构造和赋值运算符(单例)
Logger(const Logger&) = delete;
Logger& operator=(const Logger&) = delete;
// 初始化 logger必须在程序启动时调用建议main函数开头
// 参数:日志文件路径、日志文件最大大小(MB)、备份文件数量、是否开启异步
static void Init(const std::string& log_path = "logs/app.log",
size_t max_file_size_mb = 5,
size_t max_backup_count = 3,
bool is_async = true);
// 获取全局默认 logger通用日志
static std::shared_ptr<spdlog::logger> GetDefaultLogger();
// 获取指定模块的 logger局部 logger支持单独设置级别
// 模块名示例:"net"(网络模块)、"db"(数据库模块)、"ui"(界面模块)
static std::shared_ptr<spdlog::logger> GetModuleLogger(const std::string& module_name);
// 设置全局默认日志级别(对所有未单独设置级别的 logger 生效)
static void SetGlobalLevel(spdlog::level::level_enum level);
// 设置指定模块 logger 的局部级别(优先级高于全局级别)
static void SetModuleLevel(const std::string& module_name, spdlog::level::level_enum level);
// 关闭所有 logger释放资源建议程序退出时调用
static void Shutdown();
private:
// 私有构造函数(单例)
Logger();
// 析构函数
~Logger() = default;
// 单例实例
static Logger& GetInstance();
// 全局线程池(异步日志使用)- 修复thread_pool在spdlog::details命名空间下
std::shared_ptr<spdlog::details::thread_pool> thread_pool_;
// 全局默认 logger
std::shared_ptr<spdlog::logger> default_logger_;
// 新增存储全局日志格式供模块logger复用避免formatter()方法兼容问题)
std::string log_pattern_;
};
// 便捷宏定义(简化调用,可根据需求开启/关闭)
#define LOG_INFO(...) Logger::GetDefaultLogger()->info(__VA_ARGS__)
#define LOG_WARN(...) Logger::GetDefaultLogger()->warn(__VA_ARGS__)
#define LOG_ERROR(...) Logger::GetDefaultLogger()->error(__VA_ARGS__)
#define LOG_DEBUG(...) Logger::GetDefaultLogger()->debug(__VA_ARGS__)
#define LOG_CRITICAL(...) Logger::GetDefaultLogger()->critical(__VA_ARGS__)
#define LOG_TRACE(...) Logger::GetDefaultLogger()->trace(__VA_ARGS__)
// 模块日志宏定义(示例,可自行扩展)
#define LOG_NET_INFO(...) Logger::GetModuleLogger("net")->info(__VA_ARGS__)
#define LOG_DB_WARN(...) Logger::GetModuleLogger("db")->warn(__VA_ARGS__)
#define LOG_UI_ERROR(...) Logger::GetModuleLogger("ui")->error(__VA_ARGS__)