当前位置: 首页 > java >正文

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

http://www.xdnf.cn/news/3763.html

相关文章:

  • edu教育邮箱申请成功使用
  • 前端双工通信的几种方案详细描述
  • SpringMVC——第四章:三个域对象
  • WPF中Binding
  • 【SimSession】1:将视频发送逻辑与 libuv 事件循环集成是一个典型的并发设计问题
  • 【论文阅读】LLMOPT:一种提升优化泛化能力的统一学习框架
  • 【leetcode】队列 + 宽搜,树形结构层序遍历的基础与变化
  • 短信侠 - 自建手机短信转发到电脑上并无感识别复制验证码,和找手机输验证码说再见!
  • 第四节:OpenCV 基础入门-第一个 OpenCV 程序:图像读取与显示
  • 五四青年节|模糊的青春岁月,用视频高清修复工具,让回忆更清晰!
  • 如何提升个人的思维能力?
  • 学习黑客环境配置
  • c++ 指针参数传递的深层原理
  • [Vue]props解耦传参
  • 我写了一个分析 Linux 平台打开文件描述符跨进程传递的工具
  • 动态规划之多状态问题1
  • AIStarter开发者手记:一键部署本地大模型,跨平台整合包技术解析
  • 63常用控件_QSlider的使用
  • STL之list容器
  • 计算机基础:二进制基础17,八进制减法
  • 大模型中常见的精度类型及区别​
  • 论微服务架构及其应用
  • 传奇各职业/战士/法师/道士/勋章爆率及出处产出地
  • 54、【OS】【Nuttx】编码规范解读(二)
  • 130. 被围绕的区域
  • (1)大模型的提示词工程实践技巧---LLM输出配置详解
  • 数字孪生赋能智慧城市:从概念到落地的深度实践
  • 【文献阅读】中国湿地随着保护和修复的反弹
  • DeepSeek眼中的文明印记:金刚经
  • 004 树与二叉树:从原理到实战