简 述: 通过上一篇已经让 spdlog 跑了起来,现在来认识一下这个库的核心相关知识。此摘择一些核心组成的知识,降低新手门槛。
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
关联
附关联目录直达,随着后续使用,持续更新
简介
spdlog 由两部分组成:『Sinks + Loggers』。其中 Loggers 和 Sinks 的对应关系,既可以”1对1“,也可以”1对多“。
Loggers
一个 logger 可以对应多个 sink。
特征
- 每个 Logger 都包含一个数组,数组里是 std::shared_ptr,每次调用 log 时,logger 会在每个 sink 上调用 sink(log_msg) 。sink 分为多线程和单线程版本,单线程版本的 sink 不允许在多线程里调用
Sinks
sink 可以认为是一个操作文件的句柄,一个 sink 对应一个文件。日志按等级分割;创建多个,每个对应一个等级。wiki
特征
- sink 是实际写入日志的对象,每个 sink 应该只负责一个日志输出地(例如文件、控制台、数据库),并且每个 Sinks 都有自己的 formatter 对象的私有实例。
- 每个 logger 包含一个或多个
std::shared_ptr<sink>
的向量。每次调用 log 时(如果日志级别正确),logger 会调用"sink(log_msg)"
方法 - sink 有
_mt
多线程 和_st
单线程之分;单线程不能在多线程中使用。
日志级别
日志级别 Log Level
相关,通常只用到 debug
、info
、err
这三个级别比较多。
enum level_enum
{
trace = SPDLOG_LEVEL_TRACE, // 描述事件的日志级别,显示代码的逐步执行,在标准操作期间可以忽略。『最低级』
debug = SPDLOG_LEVEL_DEBUG, // 当需要更详细的信息时,使用此调试信息
info = SPDLOG_LEVEL_INFO, // 突出强调应用程序的运行过程中,输出一些提示信息
warn = SPDLOG_LEVEL_WARN, // 应用程序内部发生了意外行为,但它仍在继续工作,关键业务功能按预期运行。
err = SPDLOG_LEVEL_ERROR, // 一项或多项功能无法正常工作,导致某些功能无法正常工作。
critical = SPDLOG_LEVEL_CRITICAL, // 一项或多项关键业务功能不起作用,整个系统无法实现业务功能。
off = SPDLOG_LEVEL_OFF, // 用于关闭所有日志记录。『最高级』
n_levels
};
一些建议:
1、 err
信息必须同时打印日志和堆栈信息。
2、 线上日志统一设置为 info
级别。
3、 线上日志按照天或者小时拆分。
4、 日志存放目录采用相对路径。
5、 日志打印输出文件的大小。
注意事项
本来准备继续写的,突然搜到几篇这部分写的比较好的;就不搬运了和重复写轮子了,自行参考。这里就列举一点需要注意的地方。后面实际使用中,使用比较深入时候,再来续写其他人没有涉及的部分。
遇到日志没有输出或者显示出来?
因 spdlog 考虑到效率,内容都在缓冲区中,可通过设置确保有输出内容。控制台看不到内容同理。
logger->flush_on(spdlog::level::warn); // 遇到 warn 级别,就立即 flush 到文件 spdlog::flush_every(std::chrono::seconds(10)); // 每 10 秒刷新一次
更改输出日志格式?
set_pattern(pattern_string) 实现 formatter 的接口,然后调用 set_formatter(std::make_unique());
对于格式 flag 标识?
spdlog::set_pattern("*** [%H:%M:%S %z] [thread %t] %v ***");
对于 类似
%t
、%v
的这些参数,可以在这儿查看 wiki
系列地址
欢迎 star
⭐ 和 fork
🍴 这个系列的 C++ / QT / DTK
学习,附学习由浅入深的目录,这里你可以学到如何亲自编写这类软件的经验,这是一系列完整的教程,并且永久免费!”