spdlog自定义formatter
用了之后发现,spdlog的默认日志记录格式为:
[2014-10-31 23:46:59.678] [my_loggername] [info] Some message
但是这个格式不是我想要的,怎么办,这个也简单,上面的内容也就是几个标签的组合而已,spdlog自定义了一堆标签,你按照自己的想法重新排列组合即可。
标记 含义 例子
%v 要记录的实际文本 “some user text”
%t 线程ID “1232”
%P 进程ID “3456”
%n
logger的名称
“some logger name”
%l
消息的日志级别(如"debug"、"info"等)
“debug”, “info”, etc
%L
消息的简短日志级别(如"D"、"I"等)
“D”, “I”, etc
%a
星期几的缩写
“Thu”
%A
星期几的全称
“Thursday”
%b
月份的缩写
“Aug”
%B
月份的全称
“August”
%c
日期和时间的表示
“Thu Aug 23 15:35:46 2014”
%C
年份的两位表示
“14”
%Y
年份的四位数表示
“2014”
%D 或 %x
短日期格式(MM/DD/YY)
“08/23/14”
%m
月
“11”
%d
日
“29”
%H
24小时制的小时数
“23”
%I
12小时制的小时数
“11”
%M
分钟
“59”
%S
秒
“58”
%e
毫秒
“678”
%f
微秒
“056789”
%F
纳秒
“256789123”
%p
AM/PM
“AM”
%r 时间表示法 “02:55:02 PM”
%R 时间表示法 “23:55”
%T 或 %X 时间表示法 “23:55:59”
%z ISO 8601与UTC的时区偏移量([+/-]HH:MM) “+02:00”
%E 自纪元以来的秒数 “1528834770”
%% %符号 “%”
%+ spdlog默认的格式 “[2014-10-31 23:46:59.678] [mylogger] [info] Some message”
%^
开始颜色范围
“[mylogger] [info(green)] Some message”
%$
结束颜色范围
[+++] Some message
%@ 源文件和行号 /some/dir/my_file.cpp:123
%s 源文件(不带路径) my_file.cpp
%g 源文件(带路径) /some/dir/my_file.cpp
%# 行号 123
%! 函数名 my_func
%o 自上一条消息以来的运行时间(以毫秒为单位) 456
%i 自上一条消息以来的运行时间(以微秒为单位) 456
%u 自上一条消息以来的运行时间(以纳秒为单位) 11456
%O 自上一条消息以来的运行时间(以秒为单位) 4
但是,你可能还会说,如果这些组合还是不能满足我的需求咋办,比如说,我要把日志等级error显示为中文“错误”,这个上面的办法确实解决不了。那就只能用到终级大杀器,自定义formatter了。
class CCustomFormatter : public spdlog::formatter
{void format(const spdlog::details::log_msg &msg, spdlog::memory_buf_t &dest) override{time_t now = time(0);struct tm* currTime = localtime(&now);std::string msgType = "正常";if (msg.level == SPDLOG_LEVEL_ERROR){msgType = "错误";}std::string formatted = fmt::format("{}-{}-{} {}:{:02}:{:02} {} {}\n",currTime->tm_year + 1900, currTime->tm_mon + 1, currTime->tm_mday, currTime->tm_hour, currTime->tm_min, currTime->tm_sec, msgType, // 日志级别msg.payload);fmt::vformat_to(std::back_inserter(dest), formatted, fmt::make_format_args(msg.payload));}std::unique_ptr<spdlog::formatter> clone() const override{return std::unique_ptr<spdlog::formatter>(new CCustomFormatter(*this));}
};
上述代码,经过验证可以满足需求。
虽然只是个API调用,但是能通过API调用了解作者的设计思想,也是一个学习的过程。