spdlog的二次封装:
原因:
1.避免单例的锁冲突,因此直接创建全局的线程安全的日志器进行使用
2.因为日志输出没有文件名行号,因此使用宏进行二次封装输出日志的文件名和行号
3.封装出一个初始化接口,便于使用:调试模式则输出到标准输出,否则输出到文件中
思想:
封装出一个全局接口,用户进行日志器的创建与初始化
1.初始化接口接收一个参数:运行模式-bool
2.初始化接口接收一个参数:输出文件名 -- 用于发布模式
3.初始化接口接收一个参数:输出日志等级 -- 用于发布模式
对日志输出的接口,进行宏的封装,加入文件名行号的输出
#pragma once #include <spdlog/spdlog.h> #include <spdlog/sinks/stdout_color_sinks.h> #include <spdlog/sinks/basic_file_sink.h> #include <spdlog/async.h> #include <iostream> // mode - 运行模式: true-发布模式; false调试模式 namespace im{ std::shared_ptr<spdlog::logger> g_default_logger; void init_logger(bool mode,const std::string& file,int32_t level){ if(mode == false){ // 调试模式:彩色控制台输出,最低日志等级(输出所有日志) g_default_logger = spdlog::stdout_color_mt("default-logger"); g_default_logger->set_level(spdlog::level::level_enum::trace); g_default_logger->flush_on(spdlog::level::level_enum::trace); } else{ // 发布模式:文件输出,按参数设置日志等级 g_default_logger = spdlog::basic_logger_mt("default-logger",file); g_default_logger->set_level((spdlog::level::level_enum)level); g_default_logger->flush_on((spdlog::level::level_enum)level); } // 所有模式统一设置日志输出格式 g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l]%v"); #define LOG_TRACE(format, ...) im::g_default_logger->trace(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__) #define LOG_DEBUG(format, ...) im::g_default_logger->debug(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__) #define LOG_INFO(format, ...) im::g_default_logger->info(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__) #define LOG_WARN(format, ...) im::g_default_logger->warn(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__) #define LOG_ERROR(format, ...) im::g_default_logger->error(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__) #define LOG_FATAL(format, ...) im::g_default_logger->critical(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__) } }