在本文中,我们将讨论如何使用 Spdlog 日志库。Spdlog 是一个快速、异步、线程安全的 C++ 日志库,它可以方便地记录应用程序的运行状态,并提供了多种输出格式。

安装

Spdlog 可以通过源代码或包管理器进行安装。如果您使用的是 Linux ubuntu 系统,您可以使用包管理器安装 Spdlog:

1
sudo apt-get install libspdlog-dev

源码安装

Spdlog 日志库可以通过源代码编译安装。以下是编译和安装 Spdlog 的步骤:

  1. 从 Spdlog 的 GitHub 仓库中下载最新版本的源代码。
    1
    git clone <https://github.com/gabime/spdlog.git>
  2. 进入源代码目录并创建一个 “build” 目录。
    1
    2
    3
    cd spdlog
    mkdir build
    cd build
  3. 运行 CMake 来配置编译环境。
    1
    cmake ..
  4. 编译源代码。
    1
    make
  5. 安装 Spdlog。
    1
    sudo make install

注意:如果使用的是 Windows 操作系统,您需要使用 Visual Studio 编译器来编译和安装 Spdlog。在 Visual Studio 中,您可以使用 “CMakeLists.txt” 文件来配置编译环境。

如果使用的是 Windows 系统,您可以在 Visual Studio 的 NuGet 包管理器中安装 Spdlog。

使用

使用 Spdlog 的第一步是在代码中包含 Spdlog 头文件:

1
#include <spdlog/spdlog.h>

然后,可以使用 Spdlog 定义一个日志记录器。日志记录器是一个对象,它可以帮助记录和管理日志。可以使用以下代码定义一个基本的日志记录器:

1
auto logger = spdlog::basic_logger_mt("my_logger", "logs/my_log.txt");

这将创建一个名为 “my_logger” 的日志记录器,并将日志输出到 “logs/my_log.txt” 文件中。在上面的代码中,”mt” 表示多线程,这意味着可以在多个线程中使用同一个日志记录器。

接下来,您可以使用以下方法记录日志:

1
2
3
4
5
6
logger->trace("This is a trace message");
logger->debug("This is a debug message");
logger->info("This is an informational message");
logger->warn("This is a warning message");
logger->error("This is an error message");
logger->critical("This is a critical message");

以上方法分别记录不同级别的日志信息,您可以根据需要选择合适的级别。同时,您还可以使用 Spdlog 的格式化功能来记录更加详细的日志信息。例如:

1
2
logger->info("The value of x is: {}", x);
logger->warn("The function returned an error: {}", error_message);

在上面的代码中,”{}” 表示一个占位符,它将被后面的参数替换。

除了基本的日志记录器外,Spdlog 还提供了许多其他类型的日志记录器。例如,您可以使用 “rotating_logger_mt” 创建一个自动滚动日志记录器,或者使用 “daily_logger_mt” 创建一个每天生成一个新日志文件的日志记录器。

高级用法

除了基本的日志记录功能外,Spdlog 还提供了一些高级功能,例如异步日志记录、日志分割、自定义日志格式等。

异步日志记录

默认情况下,Spdlog 是同步日志记录器,这意味着每个日志语句都会阻塞程序,直到日志记录完成。如果你的应用程序需要高效的日志记录功能,可以使用异步日志记录器。异步日志记录器可以将日志记录操作放入另一个线程中,从而避免阻塞应用程序的主线程。以下是使用异步日志记录器的示例代码:

1
auto async_logger = spdlog::basic_logger_mt<spdlog::async_factory>("async_logger", "logs/async_log.txt");

在上面的代码中,”async_factory” 表示使用异步工厂创建日志记录器。

日志分割

当您的应用程序需要记录大量的日志信息时,单个日志文件可能会变得非常大,这可能会影响应用程序的性能和稳定性。为了避免这个问题,Spdlog 提供了日志分割功能。您可以使用以下代码创建一个自动滚动的日志记录器:

1
auto rotating_logger = spdlog::rotating_logger_mt("rotating_logger", "logs/rotating_log.txt", 1048576, 5);

在上面的代码中,”rotating_logger” 表示日志记录器的名称,”logs/rotating_log.txt” 表示日志文件的路径,”1048576” 表示每个日志文件的大小(以字节为单位),”5” 表示保留的日志文件数量。

自定义日志格式

Spdlog 默认提供了多种日志格式,但您也可以根据需要自定义日志格式。以下是自定义日志格式的示例代码:

1
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] %v");

在上面的代码中,”[%Y-%m-%d %H:%M:%S.%e]” 表示时间戳的格式,”[%l]” 表示日志级别,”%v” 表示日志内容。

Spdlog 支持的格式参数包括:

  • %v —— 日志内容
  • %n —— 换行
  • %d —— 日期和时间
  • %r —— 12 小时制时间
  • %R —— 24 小时制时间
  • %T —— 24 小时制时间(秒精度)
  • %H —— 小时(00-23)
  • %M —— 分钟(00-59)
  • %S —— 秒(00-59)
  • %e —— 毫秒(三位数字)
  • %f —— 微秒(六位数字)
  • %F —— 纳秒(九位数字)
  • %z —— 时区偏移量
  • %s —— 时间戳
  • %L —— 日志名称
  • %t —— 线程 ID
  • %P —— 进程 ID
  • %^ —— 转换为大写字母
  • %$ —— 转换为彩色输出

例如,可以使用以下代码将日志级别转换为大写字母:

1
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] %v");

在上面的代码中,”[%^%l%$]” 表示将日志级别转换为大写字母。

总结

Spdlog 是一个强大的 C++ 日志库,它提供了丰富的功能和灵活的配置选项,可以满足不同类型的应用程序的日志记录需求。在本文中,我们深入讨论了如何安装和使用 Spdlog,以及如何记录日志。我们还介绍了 Spdlog 的高级用法,包括异步日志记录、日志分割和自定义日志格式。

参考链接:https://zhuanlan.zhihu.com/p/616956826