auto sink1 = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
文件sink文件sink的类型有很多,这里展示几种经典类型
auto sink1 = std::make_shared<spdlog::sinks::basic_file_sink_mt>(log_file_name);//最简单的文件sink,只需要指定文件名auto sink2 = std::make_shared<spdlog::sinks::daily_file_sink_mt>(log_file_name, path, 14, 22);//每天的14点22分在path下创建新的文件auto sink3 = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(log_file_name, 1024 * 1024 * 10, 100, false);//轮转文件,一个文件满了会写到下一个文件,第二个参数是单文件大小上限,第三个参数是文件数量最大值
其他sinkostream_sinksyslog_sink......也可以通过继承base_sink创建子类来自定义sink,具体可以参考:https://spdlog.docsforge.com/v1.x/4.sinks/#implementing-your-own-sink
sink的flush问题创建好sink后建议设置flush方式,否则可能无法立刻在file中看到logger的内容以下为两种重要的flush方式设置(直接设置全局)
spdlog::flush_every(std::chrono::seconds(1));spdlog::flush_on(spdlog::level::debug);
logger日志对象,每个logger内包含了一个vector用于存放sink,每个sink都是相互独立因此一个日志对象在输出日志时可以同时输出到控制台和文件等位置
使用默认logger如果整个项目中只需要一个logger,spdlog提供了最为便捷的默认logger,注意,该logger在全局公用,输出到控制台、多线程、彩色
//Use the default logger (stdout, multi-threaded, colored)spdlog::info("Hello, {}!", "World");
创建特定的logger大部分情况下默认logger是不够用的,因为我们可能需要做不同项目模块各自的logger,可能需要logger输出到文件进行持久化,所以创建logger是很重要的一件事 。好在创建logger也是非常简单的!
方式一:直接创建与创建sink类似,我们可以非常便捷的创建logger由于大部分时候一个logger只会有一个sink,所以spdlog提供了创建logger的接口并封装了创建sink的过程
auto console = spdlog::stdout_color_mt("some_unique_name");//一个输出到控制台的彩色多线程logger,可以指定名字auto file_logger = spdlog::rotating_logger_mt("file_logger", "logs/mylogfile", 1048576 * 5, 3);//一个输出到指定文件的轮转文件logger,后面的参数指定了文件的信息
方式二:组合sinks方式创建有时候,单sink的logger不够用,那么可以先创建sink的vector,然后使用sinks_vector创建logger以下样例中,首先创建了sink的vector,然后创建了两个sink并放入vector,最后使用该vector创建了logger,其中,set_level的过程不是必须的,register_logger一般是必须的,否则只能在创建logger的地方使用该logger,关于register的问题可以往下看
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);auto logger = std::make_shared<spdlog::logger>("logger_name", begin(sinks), end(sinks));logger->set_level(spdlog::level::debug);spdlog::register_logger(logger);
logger的注册与获取在一个地方创建了logger却只能在该处使用肯定是不好用的,所以spdlog提供了一个全局注册和获取logger,我们只需要在某处先创建logger并注册,那么后面在其他地方使用时直接获取就可以了注册:spdlog::register_logger()获取:spdlog::get()
//上面的代码中我们注册了一个logger,名字是logger_name,接下来尝试获取auto logger = SidecarLoggers::getLogger("logger_name");
经验总结扩展阅读
- 2023年2月10日放牧黄道吉日 2023年2月10日放牧好不好
- 2023年农历正月廿十训牛吉日 2023年2月10日训牛好不好
- 一吹空调就打喷嚏是怎么回事 一直打喷嚏该怎么办
- 原神深渊火法剧情讲了什么
- 支付宝蚂蚁庄园10月13日答案是什么
- 10月是什么节气 十月份有哪些节气
- 拼多多摇一摇8.8的红包是真的吗
- 电视剧面具背后剧情介绍?
- 电视剧麦香大结局是什么?
- 拼多多摇一摇8.8的红包每个人都能摇到吗