版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
8pullrequest)。不管怎样,原先说了要介绍这个库,所以我也还是介Easylogin++一共只有两个文件,一个是头文件,一个是普通C++源文件。事实上,它的一个较早版本只有一个文件。正如Cat2里一旦定义了ATCH_CNFIG_MIN编译速度会大大减慢一样,把什么东西都放一起最终证明对编译速度还是相当不利的,因此,有人提交了一个补丁,把代码拆成了两个文件。使用Easylogin++也只需要这两个文件Easylogging++,推荐直接把这两个文件放到你的项目里。EasyloggingELPP_UNICODE:启用Unicode支持,为在Windows上输出混合语言所必需 允许使用系统日志(Unix世界的syslog)来记录日志ELPP_STL_LOGGING:允许在日志里输出常用的标准容器对象(std::vector等)ELPP_QT_LOGGING:允许在日志里输出Qt的对象(QVector等)ELPP_BOOST_LOGGINGBoost的容器ELPP_WXWIDGETS_LOGGING:允许在日志里输出某些wxWidgets的模板对象开始使用虽说Easylogging++的功能非常多,但开始使用它毫不。我们从一个简单的例子开始代代1234567#includeint{LOG(INFO)<<"Myfirstinfo}编译的时候要把easylogging++.cc放进去。比如,使用GCC的话,命令行会像g++-std=c++17test.cppmyeasylog.log2020-01-2520:47:50,990INFO[default]Myfirstinfo如果你对上面用到的宏感到好奇的话,INITIALIZE_EASYLOGGINGPP展开后(可以用编译器的-E参数查看宏展开后的结果)是定义了Easylogging++使用到的全局对象,而LOG(INFO则是Info使用如果你在Windows上,那有一个复杂性就是是否使用“Unicode”的问题 中讨论了)。就我们日志输出而言,启用Unicode支持的好处是:日志文件的格式是UTF-8要启用Unicode支持,你需要定义宏ELPP_UNICODE,并确保程序中有对std::locale::global或setlocale的调用(如 [第11讲]中所述,只有进行了正确的区域设置,才能输出含非ASCII字符的宽字符串)。下面的程序给出了一个简单的示代代123456789#include#includeint{setlocale(LC_ALL,LOG(INFOL"}cl/EHsc/DELPP_UNICODEtest.cppEasylogging++的缺省输出日志名为myeasylog.log,这在大部分情况下都是不适用的。置文件里了,如Makefile)。比如,要把输出文件名改成test.log,我们只需要在命令行不过,对于日志文件名称这样的设置,使用配置文件是一个更好的办法。Easyloging++库自己支持配置文件,我也推荐使用一个专门的配置文件,并让Easylogin++自己来加载配置文件。使用的配置文件是这个样子的:代代123456789========"%datetime{%Y-%M-%d%H:%m:%s.%g}%levshort%msg"##秒后面保留62MB写10="%datetime{%Y-%M-%d%H:%m:%s.%g}%levshort== ##项;第二节是专门用于调试(debug)级别的配置(你当然也可以自己配置fatal、error、warning等其他级别)。假设这个配置文件的名字是log.conf,代代123456789#includeint{LOG(DEBUG)<<"Adebugmessage";LOG(INFO)<<"Aninfomessage";}-DELPP_NO_DEFAULT_LOG_FILEEasylogging2020-01-2612:54:58.986739D[test.cpp:11]Adebugmessage2020-01-2612:54:58.987444IAninfomessage6我们现在只需要修改配置文件,就能调整日志格式、决定输出和不输出哪些日志了。此外,我也推荐在编译时定义宏ELPP_EBUG_ASSET_FAILRE,这样能在找不到配置文件时直接终止程序,而不是继续往下执行、在终端上以缺省的方式输出日志了。Easylogging代代123456789#include<chrono>#include<thread>#include"easylogging++.h"void{LOG(WARNING)<<"Awarning}void{usingnamespaceTIMED_SCOPE(timer1,"voidbar()");TIMED_BLOCK(timer2,"a{foo();}}intint{el::Configurations31称。示例中的TIMED_FUNC和TIMED_SCOPE的作用是完全相同的。字。如果你不喜欢TIMED_FUNC生成的函数名字,可以用TIMED_SCOPE来代替。TIMED_BLOCK用于对下面的代码块进行性能,参数形式和TIMED_SCOPE相同ELP_PERFRMANCEMICROSEONDS,来获取微秒级的精度。下面是定义了上面两个宏编译的程序的某次执行的结果:WAwarningIExecuted[void[110WAwarningIExecuted[void[5WAwarningIExecuted[void[4I[ablock][232I[voidin[398Easylogging性能产生的日志级别固定为Info。性能本身可以在配置文件里的GLOBAL节下用PERFORMANCE_TRACKING=false来关闭。当然,关闭所有Info级别的输出也能达到在GCC和Clang下,通过定义宏ELPP_FEATURE_CRASH_LOG我们可以启用日志。此时,当程序时,Easylogging++会自动在日志中记录程序的调用栈信息。通过记录下的信息,再利用addr2line这样的工具,我们就能知道是程序的哪一行了。下代代123456789#includevoid{char*ptr=*ptr=}int{}使用macOS的需要特别注意一下:由于缺省方式产生的可执行文件是位置独立的,系统每次加载程序会在不同的地址,导致无法通过地址定位到程序行。在编译命令行尾部加上-此外,Easylogging++的samples下有不少例子,可以用作参考。比如常见的日志文件切换功能,在Easylogging++里实现是需要稍微写一点代码的:Easylogging++会命名、备份之类的工作,samples/STL/roll-out.cpp则提供了最简单的实现参考。注意我使用的都是全局的日志记录器,但Easylogin++允许你使用多个不同的日志记录器,用于(比如)不同的模块或功能。你如果需要这样的功能的话,也请你自行查阅文档了。跟Easylogging++比起来,spdlog要新得多了:前者是2012年开始的项目,而后者是2014年开始的。我在2016年末开始在项目中使用Easylogging++时,Easylogging++的版本是9.85左右,而spdlog大概是0.11,成熟度和热度都不那么高。整体上,spdlog也确实感觉要新很多。项目自己提到的功能点是:开始使用跟代代123456#includeint{spdlog::info("Myfirstinfo}代码里看不到的是,输出结果中的“info”字样是彩色的,方便快速识别日志的级别。这个功能在Windows、Linux和macOS上都能正常工作,对用户还是相当友好的。不过,和Easylogging++缺省就会输出到文件中不同,spdlog缺省只是输出到终端而已。你也许从代码中已经注意到,spdlog不是使用IO流风格的输出了。它采用跟Python里str.format一样的方式,使用大括号——可选使用序号和格式化要求——来对参数进代代12345"Messagewitharg{}",42);"{0:d},{0:x},{0:o},[2020-01-2617:20:08.355][warning]Messagewitharg[2020-01-2617:20:08.355][error]42,2a,52,C++20format的风格了——spdlogformat的库实现fmt[3]。spdlog代代123456789#include#includeint{autofile_logger=spdlog::info("Intofile:{1}"world",}test.log文件里就会增加如下的内容:[2020-01-2617:47:37.864][basic_logger][info]Intofile: 答案是你可以设立一个日志记录器,让它有两个(或个)日志槽(sink)即可。示例代码如下:代代123456789#include<memory>#include"spdlog/spdlog.h"#include#includeusingnamespaceusingnamespacevoid{autoconsole_sink=make_shared<>set_pattern("%H:%M:%S.%eautofile_sink"%Y-%m-%d%H:%M:%S.%f%Lautologgerspdlog::logger({console_sink,}int{"thisshouldappearinboth"consoleand"thismessageshouldnot"appearintheconsole,only"inthe47cosole_snk是一个指向stdou_colorsink_mt的智能指针,我们设定让它只显示警告级别及以上的日志信息,并把输出式样调整成带毫秒的时间、有颜色的短级别以及信息本身。file_sinkbasic_file_sink_mt的智能指针,我们设定让它显示然后我们创建了日志记录器,让它具有上面的两个日志槽。注意这儿的两个细节:1.这儿的接口普遍使用shared_ptr;2.由于make_shared在处理initializer_list上的缺陷,对spdlog::logger的构造只能直接调用shared_ptr的构造函数,而不能使用make_shared,否则编译会出错。最后我们调用了spdog::setdefault_lgger把缺省的日志记录器设置成刚创建的对象。这样,之后的日志缺省就会记录到这个新的日志记录器了(我们当然也可以手工调用这个日志记录器的critial、error、wrn等日志记录方法)。20:44:45.086Wthisshouldappearinbothconsoleand而test.log2020-01-2620:44:45.086524Wthisshouldappearinbothconsoleandfile2020-01-2620:44:45.087174Ithismessageshouldnotappearintheconsole,onlyinthefileEasyloggingspdlog活性上也有不同的选择:Easylogging++对不同级别的日志可采用不同的式样,而spdlog对不同的日志槽可采用不同的式样。在Easylogging++里实现日志文件切换是需要写代码的,而且完善的多文件切换代码需要写上几十行代码才能实现。这项工作在spdlog则是超级简单的,因为spdlog直接提供了#include//替 …autofile_sink=6778*5,//替 //小 3个日志文spdlog运算符协同工作#include#include前一行包含了我们用于容器输出的代码,后一行包含了spdlog使用ostream来输出对象的能力。注意此处包含的顺序是重要的:spdlog必须能看到用户的的定义。在有了这vector<int>//"Contentofvector:{}",使用spdlog可以使用只用头文件的方式,也可以使用预编译的方式。只用头文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 常信院冷冲压工艺与模具设计试题三及参考答案
- 3.5 《发光发热的太阳》 同步练习小学科学三年级下册 教科版 含答案
- 2026四川西南文旅发展有限责任公司招聘工作人员4人笔试参考试题及答案解析
- 2026广西玉林市北流市人民医院赴广西医科大学双选会招聘专业技术人员28人笔试备考题库及答案解析
- 2026年烟台铁路医院医护人员招聘笔试模拟试题及答案解析
- 2026年安康泰隆银行招聘(10人)笔试参考题库及答案解析
- 全民健身中心建设项目社会稳定风险评估报告
- 2026浙江温州市瑞安市医疗保障局招聘临时人员2人笔试参考题库及答案解析
- 2026浙江宁波市镇海区龙赛医疗集团招聘编外人员8人备考题库附答案详解(培优a卷)
- 2026中国联通昌都市分公司招聘2人备考题库及1套完整答案详解
- 房地产演出合同范本
- 国开-人文社会科学基础(A)-期末终考-学习资料
- 减少内耗的课件
- 观察和处置患者用药与治疗反应的制度
- 冲压工程师技能等级评定标准
- 高一政治会考试卷真题及答案
- 2025残联招聘考试真题及答案
- 危废仓库安全管理要求与操作手册
- 基于JAVA的学生课外活动管理系统的设计与实现-论文24000字
- 基孔肯雅热防治知识培训课件
- 2025年全国医学英语水平考试(METS三级)历年参考题库含答案详解(5套)
评论
0/150
提交评论