当前位置:首页 > 公众号精选 > 程序喵大人
[导读]日志框架可以自己编写(需要一定的能力哦),也可以由第三方(例如:log4cplus)提供。对于不同的日志框架,各自在实现方式上也有所不同。


1

日志框架


 日志框架

一个经过专门设计的实用程序,用于规范应用程序的日志记录过程。


日志框架可以自己编写(需要一定的能力哦),也可以由第三方(例如:log4cplus)提供。对于不同的日志框架,各自在实现方式上也有所不同。


虽然可以简单地“标准化”日志(例如:调用文件系统 API,将信息写入名为 log.txt 的文件),但是要成为一个严格意义上的框架,必须要超越标准化。也就是说,日志框架必须通过处理日志记录来标准化解决方案,从而暴露一个标准的 API。


没明白?那就再具体一些,设想一个日志框架,封装了三个主要部分:


当想要捕获程序的运行时信息时,首先要发出要记录的信息。然后格式化这些信息,最后决定将它输出到哪里。一般情况下,会输出到文件中,但是也可以将其输出到控制台、数据库,或者任何能够接收数据的地方。


如果有一系列代码,能够解决这些问题,那么就可以被看作是一个日志框架。



2

为什么不是 cout




使用日志,只为成为更好的攻城狮。




也许有人会问:既然 C++ 中有 cout,为什么还要使用日志呢?


无法否认,在使用像 C++、Java、PHP 这样的编程语言时,我们会经常将消息打印到控制台,因为这是开发、测试和调试程序的一部分。但倘若我们正在处理一个服务端程序,却无法看到其内部发生了什么,这时该怎么办?唯一的可见性工具是日志文件,如果没有日志,我们就不能进行任何调试,也无法知道程序内部在做什么。


尽管 C++ 中有相当方便的 cout 输出流,可以在控制台上打印一些信息,或者可以通过其他方式将这些信息重定向到文件中,但这对于实际的应用程序来说根本不够。尤其对于复杂的 C++ 程序来说,像 log4cplus 或任何其他日志框架能够提供了更多的灵活性,而这是 cout 不可能完成的。


在编写代码时,使用日志框架是一种很好的实践。即使像《代码整洁之道》这样的书籍,也建议学习像 Log4 这样的框架进行日志记录。所以,应尽可能的在生产代码中使用日志,而不是用 cout 来打印东西(这是不可接受的)。



3

使用日志的好处




日志是一个优秀系统不可或缺的组成部分。



对于很多人来说,日志的作用仅限于调试。其实不然,它在很多方面都非常有用。



日志是最好的诊断工具


绝大多数人都曾面临这样的困境 - 一旦程序出现问题,很长时间都找不出原因!


缺少日志,我们将不得不依赖于客户或技术支持,让他们描述在什么情况下发生了什么(很可能会存在一些误导)。随后我们需要通过开发环境重现问题,并进行各种调试,直至错误修复为止,然而这一般会耗费很长时间。但若有日志的帮助,我们便能迅速摆脱这种困境,可以很快地发现异常,并快速定位、解决问题!



日志让我们有机会监测模块的瓶颈


随着项目规模的增加,模块会越来越多,调优也变成了一场持久战。


通过记录某些操作所花费的时间,我们可以及时地检测模块的瓶颈,并针对性地对一些耗时操作做出优化。



日志有助于我们了解用户的行为


为了提高产品质量,提供个性化服务,就必须了解用户行为 - 他们做了什么,想要什么。


要搞清楚这些,当然要有数据,所以需要采集和分析用户的行为,而日志无疑是最主要的数据来源。



4

要不要重新发明轮子


不要去重新发明轮子 - 《麦肯锡方法》



既然已经对日志框架有了明确的了解,那么应该使用现有的日志框架,还是构建自己的日志框架呢?其实,这是一个老生常谈的问题了 - 要不要重新发明轮子?引用莎士比亚戏剧《哈姆雷特》中的一句名言:


To be or not to be - that is the question.


现在我们正处于技术大爆发的时代,每一个技术领域中都有很多优秀的解决方案。因此,自己完全不需要、也不应该去写日志框架。就像不应该写版本控制工具或 Bug 跟踪管理工具一样,其他人已经把这些东西搞出来了,而且搞的很好,Git、SVN,Bugzilla、Trac ...... 应有尽有,我们完全可以花很少的钱,甚至是免费使用它们。


所以,请避免重复劳动,不要去重新发明轮子。应该坚持在自己的领域解决问题,将时间花在刀刃上。话虽如此,但我们还是需要了解关于轮子的一些细节(谁造的?怎么创造的?如何使用?),以从中接受灵感,并把自己的知识加进去。


因此,当需要一个日志框架时,应该使用现有的框架,而不是去重新发明轮子。那么,问题来了,日志框架都有哪些呢?



5

日志框架都有哪些


C++ 中的日志框架有很多,其中比较著名的有:


  • log4cxx:Java 社区著名的 Log4j 的 C++ 移植版,用于为 C++ 程序提供日志功能,以便开发者对目标程序进行调试和审计。

  • log4cplus:一个简单易用的 C++ 日志记录 API,它提供了对日志管理和配置的线程安全、灵活和任意粒度控制(也基于 Log4j)。

  • Log4cpp:一个 C++ 类库,可以灵活地记录到文件、syslog、IDSA 和其他目的地(也基于 Log4j)。

  • google-glog:一个 C++ 语言的应用级日志记录框架,提供了 C++ 风格的流操作和各种辅助宏。

  • Pantheios:一个类型安全、高效、泛型和可扩展性的 C++ 日志 API 库(号称 C++ 领域速度最快的日志库)。

  • POCO:还提供了一个 好的日志支持文档。

  • ACE:ACE 也有日志支持。

  • Boost.Log:设计的非常模块化,并且可扩展。

  • Easylogging++:轻量级高性能 C++ 日志库(只有一个头文件)。

  • G3log:一个开源、支持跨平台的异步 C++ 日志框架,支持自定义日志格式。基于 g2log 构建,提升了性能,支持自定义格式。

  • Plog:可移植、简单和可扩展的 C++ 日志库。

  • spdlog:一个快速的 C++ 日志库,只包含头文件,兼容 C++11。

  • ……


这么多框架,应该选择哪一个呢?


由于每个人的需求和技术栈都不一样,所以很难直接回答这个问题,但是有一些选择标准可供参考。



6

日志选择标准



易用性




易于使用的框架,能让你事半功倍。



易用性,是优秀框架的一个重要特性。所以无论使用什么框架,都应优先考虑这一点。


对于日志框架而言,一旦被选定,在后期开发过程中,项目组中的每个人都会频繁使用。如果易用性不好的话,那绝对是一个噩梦!所以,在选择日志框架时,应尽量找那些由简单、直观的 API 实现的方案。衡量标准可参考:对于缺乏经验的团队成员,应该在查看文档和简单示例之后,就能够快速上手。



性能(效率)




功能决定当下,性能决定未来。



另一个要考虑的重要因素是性能影响。正如上面提到的,我们会经常调用日志,这可能会对程序的性能产生巨大的影响。


想象一下,一个日志框架,需要花费很长的时间才能启动,在每次调用时阻塞并执行文件 I/O,缺少缓冲机制……对于这样的框架,你会用吗?


因此,在评估日志框架时,可以参考网上的一些文章来比较,也可以自己做一些比较性实验(基准测试),例如:吞吐量 - 测量每秒可以完成多少次方法调用(越高越好);采样 - 测量每次调用执行究竟花费了多少时间(越低越好)。



对现有代码的影响




影响越小,越容易维护。



在以后的使用中,日志将无处不在。就像会影响运行时性能一样,它们也会影响源码的可维护性。


从应用程序的角度来看,日志所处的位置比较尴尬。之所以这么说,是因为我们尽力隔离依赖性,提供良好的接口,并最小化耦合,在编程时考虑的是单一职责原则。然后日志出现了,它到处都是,与周围的代码无关。与这些优秀的设计原则相比,日志显得有些背道而驰。


因此,应充分考虑所引入日志的影响范围,尽量让我们的代码改动最小化!



社区支持




每一个成功框架的背后,都有一个伟大的社区。



框架的生命力源于不断地完善和发展,如果没有强大的社区做支撑,这个框架便失去了源动力。


因此,在选择框架时,这一点非常重要 - 所选的框架是否有专门的团队做支撑?在像 Stack Overflow 这样的问答网站上,它是否有很强的存在感?确保一点,如果在使用过程中遇到了问题,你能有办法快速解决。倘若选择了一个不知名的框架,当遇到了 Bug 时,那么可能会浪费大量的时间来解决问题。



完整性




完整的框架,铸就完美的生产力。



在最前面,我们将日志的功能分为三个主要部分:日志记录、格式化和输出地,所以要确保所选的日志框架彻底解决了这些问题。


日志记录和输出地比较基础,几乎所有日志框架都有这些概念。话虽如此,但对于好的框架来说,应该巧妙地将日志记录与输出地分开,并且还应该有多种可选的输出地。在理想情况下,最好能够自定义输出地。


一般情况下,格式化日志文件会整齐地排列,并具有很好的可读性。但在 DevOps 的世界里,这些远远不够。具体来说,日志文件需要被格式化为可解析的数据。通过将日志输出作为数据处理,可以很容易地聚合、搜索和可视化日志,从而能够在生产支持方面助你一臂之力。所以,要确保日志框架拥有这种能力。



发展前景




只有前途光明,方能大行其道。



无法绕过这一点 - 在选择日志框架时,不仅要考虑它的现状,还应该注重它的发展前景。


像上面提到的 C++ 日志框架,每一个都非常优秀且特点鲜明。但有一些却获得了更多的关注度,例如 log4cplus、glog,为什么如此呢?因为它们有很强大的“基因”和“后台”,一个是著名的 Log4j 的衍生品,另一个则是 Google 的“亲儿子”。


一个框架的发展前景,取决于众多因素 - 关注度、用户基数、社区活跃度 …… 要想大行其道,这些几乎都不能少。


往期推荐


1、深度好文|面试官:进程和线程,我只问这19个问题

2、他来了,他来了,C++17新特性精华都在这了

3、一文让你搞懂设计模式

4、C++11新特性,所有知识点都在这了!





免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭