Files
krylov/include/logger/logger.hpp
2026-04-09 19:38:56 +08:00

70 lines
3.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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__)