关于注册与获取需要注意的事
- 必须先创建注册才能获取,建议每个模块的logger都在整个模块最开始初始化时创建并注册 。如果在全局尝试获取不存在的logger,会返回空指针,如果恰好又使用空指针尝试输出logger,会造成整个程序的崩溃(访问非法内存了,segment fault)
- 通过上述的方式一创建的logger是自动注册的,不需要手动注册,但是方式二创建的logger需要手动注册
- 一旦注册,全局使用,名字标识logger,在各个模块获取同一个名字的logger会获取到同一个logger的指针
logger->debug("this is a debug msg");logger->warn("warn!!!!");logger->info("hello world");logger->error("烫烫烫烫");
logger的level设置logger的默认level是info,如果处于开发环境或者生产环境,会只需要debug级别以上或者warn级别以上的log要设置logger的级别,很简单:logger->set_level(spdlog::level::debug);
可以设置全局logger级别spdlog::set_level(spdlog::level::warn);
可以设置sink级别的loggersink1->set_level(spdlog::level::info);
注意:一个logger内假如有多个sink,那么这些sink分别设置level是可以不同的,但是由于logger本身也有level,所以真正使用时,logger的level如果高于某个sink,会覆盖该sink的level,所以建议此时把logger的level手动设置为debug(默认为info)样例代码以下代码为本人对spdlog的简单使用封装,主要功能有:
- 一键初始化,根据环境变量可设置修改logger级别等
- 一键创建双sink的logger(控制台和文件)
- 一键获取logger,假如logger不存在则创建
#ifndef SIDECAR_LOGGER_H#define SIDECAR_LOGGER_H#include <stdlib.h>#include "spdlog/spdlog.h"#include "spdlog/sinks/stdout_color_sinks.h"#include "spdlog/sinks/stdout_sinks.h"#include "spdlog/sinks/basic_file_sink.h"#include "spdlog/sinks/rotating_file_sink.h"#include "spdlog/sinks/daily_file_sink.h"#include <vector>class SidecarLoggers{public:static void init();static spdlog::level::level_enum getGlobalLevel();static std::vector<spdlog::sink_ptr> createSinks(const std::string &log_file_name);static void createLogger(const std::string &logger_name);static std::shared_ptr<spdlog::logger> getLogger(const std::string &logger_name);private:static spdlog::level::level_enum global_level;};#endif
源文件#include "sidecar_logger.h"spdlog::level::level_enum SidecarLoggers::global_level = spdlog::level::info;spdlog::level::level_enum SidecarLoggers::getGlobalLevel(){return global_level;}std::vector<spdlog::sink_ptr> SidecarLoggers::createSinks(const std::string &log_file_name){std::vector<spdlog::sink_ptr> sinks;auto sink1 = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();sink1->set_level(SidecarLoggers::getGlobalLevel());sinks.push_back(sink1);auto sink2 = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(log_file_name, 1024 * 1024 * 10, 100, false);sink2->set_level(spdlog::level::debug);sinks.push_back(sink2);return sinks;}void SidecarLoggers::createLogger(const std::string &logger_name){std::string log_file_name = logger_name + "_log.txt";auto sinks = SidecarLoggers::createSinks(log_file_name);auto logger = std::make_shared<spdlog::logger>(logger_name, begin(sinks), end(sinks));logger->set_level(spdlog::level::debug);spdlog::register_logger(logger);}std::shared_ptr<spdlog::logger> SidecarLoggers::getLogger(const std::string &logger_name){auto logger = spdlog::get(logger_name);if(!logger){//looger指向为空createLogger(logger_name);logger = spdlog::get(logger_name);}return logger;}void SidecarLoggers::init(){auto level = spdlog::level::debug;if (std::getenv("STAGE") != NULL){std::string stage = std::getenv("STAGE");if (stage == "dev")level = spdlog::level::debug;}SidecarLoggers::global_level = level;spdlog::flush_every(std::chrono::seconds(1));spdlog::flush_on(spdlog::level::debug);SidecarLoggers::createLogger("sidecar");}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 2023年2月10日放牧黄道吉日 2023年2月10日放牧好不好
- 2023年农历正月廿十训牛吉日 2023年2月10日训牛好不好
- 一吹空调就打喷嚏是怎么回事 一直打喷嚏该怎么办
- 原神深渊火法剧情讲了什么
- 支付宝蚂蚁庄园10月13日答案是什么
- 10月是什么节气 十月份有哪些节气
- 拼多多摇一摇8.8的红包是真的吗
- 电视剧面具背后剧情介绍?
- 电视剧麦香大结局是什么?
- 拼多多摇一摇8.8的红包每个人都能摇到吗