新手看spdlog源码做笔记以及附上简单使用手册
version 1.7.0
tweakme.h
- SPDLOG_CLOCK_COARSE
如果Linux开启 相比常规时钟获得更快的速度但是精确度会稍微降低 - SPDLOG_NO_THREAD_ID
如果开启 每次的log call调用获取thread id会返回0 - SPDLOG_NO_TLS
如果开启 可以避免spdlog使用线程本地空间 如果你的程序是多线程的可以防止未
定义thread ids - SPDLOG_NO_ATOMIC_LEVELS
如果开启 如同字面意思不使用原子性的的log level设置
当且仅当(Use only if)你确定不会通过不同的线程同时改变一个logger的log level时可以开启 - SPDLOG_WCHAR_FILENAMES
如果开启 可以使用wchar字符的文件名WIN下开启才有效
- SPDLOG_EOL
如果开启 自定义EOL - SPDLOG_FMT_EXTERNAL
如果开启 使用外部三方库的FMT - SPDLOG_WCHAR_TO_UTF8_SUPPORT
如果开启 字面意思WIN下开启才有效
- SPDLOG_PREVENT_CHILD_FD
- 如果开启 防止子进程继承文件描述符
- SPDLOG_LEVEL_NAMES
如果开启 自定义level name - SPDLOG_SHORT_LEVEL_NAMES
如果开启 自定义level name的缩写 - SPDLOG_DISABLE_DEFAULT_LOGGER
如果开启 会关闭默认的LOGGER - SPDLOG_ACTIVE_LEVEL
如果开启 自定义编译时level默认为info - SPDLOG_FUNCTION
如果开启 自定义函数名字宏 比如__PRETTY_FUNCTION__
__FUNCTION__
关于level_t
正常默认使用std::atomic<int>作为level_t的类型
如果有定义上述的SPDLOG_NO_ATOMIC_LEVELS非原子级的Level宏定义
那么level_t会使用 一个自定义的 null_atomic_int 类 这个类提供类似atomic的store和load和exchange操作
发现在exchange里面用到了swap
这里学到一个小技巧 在允许的情况系 交换两个变量的值 swap 会使用std::move效率更高
关于detail/registry.h
单例负责logger的注册管理以及全局的logger设置
比如有默认的flush_level err_handler_ log_level等等
关于logger
class source_loc
filename 文件名
funcname 函数名
line 行号
class log_msg
logger_name
level
time 默认当前时间
thread_id 与上述的SPDLOG_NO_THREAD_ID定义有关
source 默认构造为空
payload 有效荷载msg
关于pattern_formatter
这个主要是控制个格式相关
关于sinks(接收器)
这个主要是控制输出的 我在Debian10 x64的虚拟机下默认是ansicolor_stdout_sink_mt
注意输出有一个输出等级flush_level_在logger中有一个控制是当前日志的等级比这个高才会在log时立刻执行flush
但是ansicolor_stdout_sink_mt在sink_it_时有立刻flush
但是ostream_sink是没有flush那就会由logger的flush_level_控制是否立刻flush
basic_file_sink是文件输出的sink_it_只有write没有flush
一些小结注意事项和设置等如下其实官方的例子比这里好
int test_log()
{// 默认的spdlog::info("infomsg");spdlog::error(fmt::format("error: today is {} {} day ! {}", "a", "bad", 666));spdlog::critical("criticalmsg: today is {} {} day ! {}", "a", "nice", 777);// 不会输出 等级不够spdlog::debug("debugmsg1");// 设置levelspdlog::set_level(spdlog::level::debug);spdlog::debug("debugmsg2");spdlog::set_level(spdlog::level::info);// 创建osstreamspdlog::create<spdlog::sinks::ostream_sink_mt>("osstream.txt", std::cout, true);auto log_ins = spdlog::get("osstream.txt");// 设置flush_levellog_ins->flush_on(spdlog::level::trace);log_ins->trace("haa ostream trace 1");log_ins->debug("haa ostream debug 1");log_ins->set_level(spdlog::level::debug);log_ins->trace("haa ostream trace 2");log_ins->debug("haa ostream debug 2");log_ins->set_level(spdlog::level::info);log_ins->info("haa ostream info 11");log_ins->info("haa ostream info 22 {} {}", "a", 1);log_ins->info(fmt::format("haa ostream info 33 {} {}", "a", 1));log_ins->warn("haa ostream warn 44");log_ins->error("haa ostream error 55");log_ins->critical("haa ostream critical 66");spdlog::daily_logger_mt("daily.txt", "daily.txt", 0, 0, false, 0);log_ins = spdlog::get("daily.txt");log_ins->info("daily info");spdlog::rotating_logger_mt("rotating.txt", "rotating.txt", 1, 3, true);log_ins = spdlog::get("rotating.txt");log_ins->info("a");log_ins->info("b");log_ins->info("c");log_ins->info("d");// 用osstream测试backtracespdlog::create<spdlog::sinks::ostream_sink_mt>("backtrace.txt", std::cout, true);log_ins = spdlog::get("backtrace.txt");log_ins->enable_backtrace(3);log_ins->info(1);log_ins->info(2);log_ins->info(3);log_ins->info(4);// trace只会有3条log_ins->dump_backtrace();// 第二次trace没有记录的 因为上一行trace之后已经没数据了log_ins->dump_backtrace();// debug的尽管因为log_level_不会输出 但是会记录的trace中 trace时可以看到debug记录// trace级别的也是同理log_ins->trace(5);log_ins->debug(6);log_ins->dump_backtrace();log_ins->info(7);log_ins->dump_backtrace();// 创建一个带有多个sink的logger// 会同时输出和写文件auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();auto rotating_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("multiply.txt", 0xfffff, 3);std::vector<spdlog::sink_ptr> sinks{stdout_sink, rotating_sink};log_ins = std::make_shared<spdlog::logger>("multiply.txt", sinks.begin(), sinks.end());log_ins->info("multiply 11");log_ins->info("multiply 22 {} {}", "a", 1);log_ins->info(fmt::format("multiply 33 {} {}", "a", 1));// 添加自定义的flag_formatterclass my_formatter_flag : public spdlog::custom_flag_formatter{public:void format(const spdlog::details::log_msg &log_msg, const std::tm &, spdlog::memory_buf_t &dest) override{std::string some_txt = "custom-flag";dest.append(some_txt.data(), some_txt.data() + some_txt.size());}std::unique_ptr<custom_flag_formatter> clone() const override{return spdlog::details::make_unique<my_formatter_flag>();}};spdlog::basic_logger_mt("custom_flag_formatter.txt", "custom_flag_formatter.txt");log_ins = spdlog::get("custom_flag_formatter.txt");auto formatter = std::make_unique<spdlog::pattern_formatter>();// 注意这里的两个*号// 一定要set_pattern中带有*号才会生效o// 不然你定义这个custom_flag_formatter也没意义formatter->add_flag<my_formatter_flag>('*').set_pattern("[%n] [%*] [%^%l%$] %v");log_ins->set_formatter(std::move(formatter));log_ins->info("custom_flag_formatter 11");log_ins->info("custom_flag_formatter 22 {} {}", "a", 1);log_ins->info(fmt::format("custom_flag_formatter 33 {} {}", "a", 1));return 0;
}
新手看spdlog源码做笔记以及附上简单使用手册相关推荐
- SharpDevelop源码分析笔记(一)
SharpDevelop自动命令启动UI部分(看SharpDevelop源码分析笔记随想) 参见:Fbt2008的大作 SharpDevelop源码分析笔记(一) 源文档 <http://ww ...
- Retrofit源码分析笔记(一)
如遇图片无法加载请点击此链接 我们先从最简单的Retrofit使用方法看 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n7bbuois-1665971394319)( ...
- 震撼来袭,阿里高工的源码解析笔记手抄本,看完去怼面试官
很多程序员一开始在学习上找不到方向,但我想在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐渐变得清晰起来. 但是没过多久,能了解到的资料就开始超过每天学习的能力,像是买了 ...
- 源码阅读笔记 BiLSTM+CRF做NER任务 流程图
源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...
- spring源码深度解析 第2版 pdf_吹爆!阿里爆款Spring源码高级笔记,原来看懂源码如此简单...
Spring的影响力想必无需与大家多说,如果你用spring,那么读读源码有助于对你最重要的工具的理解,好的框架源码也可以帮助我们理解什么是好代码. 刚参加工作那会,没想过去读源码,更没想过去改框架的 ...
- Winform1、看Winform源码时要做的开始步骤
Winform1.看Winform源码时要做的开始步骤 1.打开控件的窗口文件,看窗口选控件,看控件的名称和属性,再看控件的事件函数.这样就可以按需阅读需要懂的控件,不会盲目. 注意:在VS2019中 ...
- MyBatis源码学习笔记(从设计模式看源码)
文章目录 1.源码分析概述 ①.Mybatis架构分析 ②.门面模式 ③.设计模式的原则 2.日志模块分析 ①.适配器模型 ②.动态代理 ③.日志模块分析 3.数据源模块分析 ①.工厂模式 ②.数据源 ...
- 吹爆!阿里新产Spring源码高级笔记,原来看懂源码如此简单
Spring的影响力想必无需与大家多说,如果你用spring,那么读读源码有助于对你最重要的工具的理解,好的框架源码也可以帮助我们理解什么是好代码. 刚参加工作那会,没想过去读源码,更没想过去改框架的 ...
- 铁血联盟2源码学习笔记--Makefile边看边学
有了一定的基础,阅读一个大型的项目,我想这也是一个不错的学习途径吧. 这只是一个学习笔记,只记下那些我之前不了解,看了源码后现学的知识. 我的学习方法是下了GNU Make 和 GCC的帮助文档,通过 ...
最新文章
- 二进制,十进制,十六进制
- java sourcepath_说一下Java里面的路径问题,CLASSPATH和SOURCEPATH
- logstash 吞吐量优化_1002-谈谈ELK日志分析平台的性能优化理念
- 野火开发版屏幕_鸿蒙2.0手机开发者版发布,华为多数自研设备明年升级鸿蒙
- jquery ajax 上传文件报错,jQuery :ajaxfileupload+Struts2 文件上传,报错data undefined
- 恩布开源安卓手机IM,EntboostIM发布1.5.1版本
- db2查询字段备注_SQL基础7:SQLSERVER、ORACLE、DB2中SQL语句查询表字段名、注释、字段类型...
- 打造前端MAC工作站(二)安装软件的两种方法
- 类似鹅厂的H5农场游戏,牧场游戏 博主亲自搭建
- C#实战之CAD二次开发005:打印pdf
- ae渲染出现错误是什么问题_AE渲染输出损坏怎么解决?教你如何渲染才是正确的...
- 手机个人热点连接台式计算机,电脑怎么连接手机个人热点
- Google谷歌新手SEO优化教程篇【1】
- hibernate报错could not insert
- 常见sketch简介
- C·cJSON库函数--cJSON_GetObjectItem
- 微信小程序的左右布局
- 情人节——与她对弈五子棋(Python实现)
- QQ远程系统权限原因,暂时无法操作
- 依赖倒转原则 (Dependence Inversion Principle)