简 述: 通过上一篇已经让 spdlog 跑了起来,现在来认识一下这个库的核心相关知识。此摘择一些核心组成的知识,降低新手门槛。

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


关联

  附关联目录直达,随着后续使用,持续更新

  1. Log:日志选型调研『一』
  2. Log:日志之 Spdlog 极简用法示范『二』
  3. Log:日志之 Spdlog 核心构成『三』

简介

  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 相关,通常只用到 debuginfoerr 这三个级别比较多。

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、 日志打印输出文件的大小。


注意事项

  本来准备继续写的,突然搜到几篇这部分写的比较好的;就不搬运了和重复写轮子了,自行参考。这里就列举一点需要注意的地方。后面实际使用中,使用比较深入时候,再来续写其他人没有涉及的部分。



  1. 遇到日志没有输出或者显示出来?

    因 spdlog 考虑到效率,内容都在缓冲区中,可通过设置确保有输出内容。控制台看不到内容同理。

    logger->flush_on(spdlog::level::warn);            // 遇到 warn 级别,就立即 flush 到文件 
    spdlog::flush_every(std::chrono::seconds(10));    // 每 10 秒刷新一次
  2. 更改输出日志格式?

    set_pattern(pattern_string)
    实现 formatter 的接口,然后调用 set_formatter(std::make_unique());
  3. 对于格式 flag 标识?

    spdlog::set_pattern("*** [%H:%M:%S %z] [thread %t] %v ***");

    对于 类似 %t%v 的这些参数,可以在这儿查看 wiki


系列地址

QtExamples

欢迎 star ⭐ 和 fork 🍴 这个系列的 C++ / QT / DTK 学习,附学习由浅入深的目录,这里你可以学到如何亲自编写这类软件的经验,这是一系列完整的教程,并且永久免费!”