Spdlog

介绍

spdlog 是一个高性能、超快速、零配置的C++ 日志库,它旨在提供简洁的API 和丰富的功能,同时保持高性能的日志记录。它支持多种输出目标、格式化选项、线程安全以及异步日志记录。以下是对spdlog 的详细介绍和使用方法。

github链接:https://github.com/gabime/spdlog

特点

  • 高性能:spdlog 专为速度而设计,即使在高负载情况下也能保持良好的性能。
  • 零配置:无需复杂的配置,只需包含头文件即可在项目中使用。
  • 异步日志:支持异步日志记录,减少对主线程的影响。
  • 格式化:支持自定义日志消息的格式化,包括时间戳、线程ID、日志级别等。
  • 多平台:跨平台兼容,支持Windows、Linux、macOS 等操作系统。
  • 丰富的 API:提供丰富的日志级别和操作符重载,方便记录各种类型的日志。

spdlog与glog组件对比

glog 和spdlog 都是流行的C++ 日志库,它们各自具有不同的特点和优势。以下是对这两个库的对比分析,包括性能测试的结果和使用场景的考量。

glog

glog是由Google开发的一个开源C++日志库,它提供了丰富的日志功能,包括多种日志级别、条件日志记录、日志文件管理、信号处理、自定义日志格式等。glog 默认情况下是同步记录日志的,这意味着每次写日志操作都会阻塞直到日志数据被写入磁盘。

性能

根据张生荣的性能对比测试分析,glog 在同步调用的场景下的性能较spdlog 慢。在一台低配的服务器上,glog 耗时1.027秒处理十万笔日志数据,而在固态硬盘上的耗时为0.475秒。

spdlog

spdlog 是一个开源的、高性能的C++ 日志库,它支持异步日志记录,允许在不影响主线程的情况下进行日志写入。spdlog 旨在提供零配置的用户体验,只需包含头文件即可使用。它还支持多种输出目标、格式化选项和线程安全。

性能

在同样的性能测试中,spdlog 在同步调用的场景下比glog 快。在低配服务器上的耗时为0.135秒,而在固态硬盘上的耗时为0.057秒。此外,spdlog 还提供了异步日志记录的功能,其简单异步模式的耗时为0.158秒。

对比总结

  • 性能:从性能测试结果来看,spdlog 在同步调用场景下的性能优于glog。当涉及到大量日志数据时,spdlog 显示出更快的处理速度。
  • 异步日志:spdlog 支持异步日志记录,这在处理高负载应用程序时非常有用,可以减少日志操作对主线程的影响。
  • 易用性:spdlog 提供了更简单的集成和配置方式,只需包含头文件即可使用,而glog 可能需要额外的编译和配置步骤。
  • 功能:glog 提供了一些特定的功能,如条件日志记录和信号处理,这些在某些场景下可能非常有用。
  • 使用场景:glog 可能更适合那些对日志性能要求不是特别高,但需要一些特定功能的场景。而spdlog则适合需要高性能日志记录和异步日志能力的应用程序。

使用

包含头文件

在你的C++源文件中包含spdlog的头文件:

1
#include <spdlog/spdlog.h>

日志输出等级枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace level 
{
enum level_enum : int
{
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
2
3
4
5
6
7
8
9
10
11
logger->set_pattern("%Y-%m-%d %H:%M:%S [%t] [%-7l] %v");
%t - 线程ID(Thread ID)。
%n - 日志器名称(Logger name)。
%l - 日志级别名称(Level name),如 INFO, DEBUG, ERROR 等。
%v - 日志内容(message)。
%Y - 年(Year)。
%m - 月(Month)。
%d - 日(Day)。
%H - 小时(24-hour format)。
%M - 分钟(Minute)。
%S - 秒(Second)。

CMake链接

1
2
3
4
5
6
7
8
9
cmake_minimum_required(VERSION 3.20)

project(testlogger)

find_package(spdlog REQUIRED)

add_executable(testlogger.exe testlogger.cpp)

target_link_libraries(testlogger.exe PRIVATE gflags spdlog::spdlog)