文章目录
- Part.I Introduction
- Chap.I 预备知识
- Chap.II 常用语句
- Part.II 使用
- Chap.I 简单使用
- Chap.II 自定义日志格式
- Part.III 问题&解决方案
- Chap.I 如果文件存在则删除
- Reference
Part.I Introduction
spdlog 是一个开源的 C++ 日志管理工具,Git 上面的地址为
Git 仓库:https://github.com/gabime/spdlog
Chap.I 预备知识
下面是使用 spdlog 前需要了解的一些东西
- 日志等级:trace(T) < debug(D) < info(I) < warn(W) < err(E) < critical(C ) < off。
off
表示关闭,举个例子,如果设置的日志等级为info
,那么 debug 和 trace 的信息将不会显示,只会显示等级大于等于info
的日志。默认的日志等级为info
。 - 日志类型:
CONSOLE
,ROTATING
,BASIC
,DAILY
Chap.II 常用语句
下面是一些常用语句
spdlog::set_pattern("[%Y-%m-%d %T] [%^%L%$] %v"); // 设置日志格式
SPDLOG_TRACE("Some trace message with param {}", 42); // 这两个好像不会输出,改变日志等级也不会,spdlog::trace 就可以
SPDLOG_DEBUG("Some debug message with param {}", 42);
SPDLOG_INFO("Some info message with param {}", 42); // 不同等级的日志输出
SPDLOG_WARN("Some warn message with param {}", 42);
SPDLOG_ERROR("Some error message with param {}", 42);
SPDLOG_CRITICAL("Some critical message with param {}", 42);
spdlog::info("Welcome to spdlog!"); // 或者用这种格式
spdlog::set_level(spdlog::level::info); // 设置日志输出等级
SPDLOG_LEVEL_TRACE()
SPDLOG_LEVEL_DEBUG()
SPDLOG_LEVEL_INFO()
SPDLOG_LEVEL_WARN()
SPDLOG_LEVEL_ERROR()
SPDLOG_LEVEL_CRITICAL()
Part.II 使用
使用的时候,只需要 include/
文件夹就行了。比如,使用 VS Studio 可以选中项目→右键→属性→C/C++→常规→附加包含目录→编辑→把include/
文件的路径加入进去即可。
实际上,上面这种方法几乎适用于以 VS Studio 作为编译环境的,所有三方库的添加。 另外,还可以用 cmake 来添加。
Chap.I 简单使用
根据官方说明文档,可直接这样使用,
#include <iostream>
#include "spdlog/spdlog.h"
using namespace std;
int main()
{
spdlog::info("Welcome to spdlog!");
spdlog::error("Some error message with arg: {}", 1);
spdlog::warn("Easy padding in numbers like {:08d}", 12);
spdlog::critical("Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
spdlog::info("Support for floats {:03.2f}", 1.23456);
spdlog::info("Positional args are {1} {0}..", "too", "supported");
spdlog::info("{:<30}", "left aligned");
spdlog::set_level(spdlog::level::debug); // Set global log level to debug
spdlog::debug("This message should be displayed..");
// change log pattern
spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");
// Compile time log levels
// define SPDLOG_ACTIVE_LEVEL to desired level
SPDLOG_TRACE("Some trace message with param {}", 42);
SPDLOG_DEBUG("Some debug message");
getchar();
}
Chap.II 自定义日志格式
spdlog 默认的输出格式为:
[2014-31-10 23:46:59.678] [info] [my_loggername] Some message
要定制输出格式,可以调用:
spdlog::set_pattern(pattern_string);
//示例
spdlog::set_pattern("***[%H:%M:%S %z] [thread %t] %v***");
或者实现自己的格式化器:
spdlog::set_formatter(std::make_shared<my_custom_formatter>());
输出格式的Pattern中可以有若干%开头的标记,含义如下表:
标记 | 说明 |
---|---|
%v | 实际需要被日志记录的文本,如果文本中有{占位符}会被替换 |
%t | 线程标识符 |
%P | 进程标识符 |
%n | 日志记录器名称 |
%l | 日志级别 |
%L | 日志级别简写 |
%^ | 转换为大写字母 |
%$ | 转换为彩色输出 |
%a | 简写的周几,例如Thu |
%A | 周几,例如Thursday |
%b | 简写的月份,例如Aug |
%B | 月份,例如August |
%c | 日期时间,例如 Thu Aug 2315:35:46 2014 |
%C | 两位年份,例如14 |
%Y | 四位年份,例如2014 |
%D或%x | MM/DD/YY格式日期,例如"08/23/14 |
%m | 月份,1-12之间 |
%d | 月份中的第几天,1-31之间 |
%H | 24小时制的小时,0-23之间 |
%l | 12小时制的小时,1-12之间 |
%M | 分钟,0-59 |
%S | 秒,0-59 |
%e | 当前秒内的毫秒,0-999 |
%f | 当前秒内的微秒,0-999999 |
%F | 当前秒内的纳秒,0-999999999 |
%p | AM或者PM |
%r | 12小时时间,例如 02:55:02 pm |
%R | 等价于%H:%M,例如23:55 |
%T或%X | HH:MM:SS |
%z | 时区UTC偏移,例如+02:00 |
%+ | 表示默认格式 |
下面是笔者常用的设置
spdlog::set_pattern("[%Y-%m-%d %T] [%^%L%$] %v");
SPDLOG_INFO("Some info message with param {}", 42);
// -------------- 样式如下 ---------------
[2023-07-07 12:16:41] [I] Some info message with param 42
Part.III 问题&解决方案
Chap.I 如果文件存在则删除
在原 log 文件存在的情况下,使用 spdlog 会报错。所以需要自己添加代码把原 log 文件给删除。
#include <sys/stat.h>
struct stat buffer;
if (stat(str_log_name.c_str(), &buffer) == 0)
{// if the file exists, remove it.
remove(str_log_name.c_str());
}
Reference
- spdlog GitHub 仓库