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调用了解作者的设计思想,也是一个学习的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值