日志框架可以自己编写(技能要牛才行哦),也可以由第三方(例如:log4cplus)供应。对付不同的日志框架,各自的组织在实现办法上也有所不同。
虽然可以大略地“标准化”日志(例如:调用文件系统 API,将信息写入名为 log.txt 的文件),但是要成为一个严格意义上的框架,必须要超越标准化。也便是说,日志框架必须通过处理日志记录来标准化办理方案,从而暴露一个标准的 API。
没明白?那就再详细一些,设想一个日志框架,封装了三个紧张部分:
紧张组成
当想要捕获程序的运行时信息时,首先要发出要记录的信息。然后,格式化这些信息。末了,决定将它输出到哪里。一样平常情形下,会输出到文件中,但是也可以将其输出到掌握台、数据库,或者任何能够吸收数据的地方。
如果有一系列代码,能够办理这些问题,那么就可以被看作是一个日志框架。
为什么不是 cout
利用日志,只为成为更好的攻城狮。
大概有人会问:既然 C++ 中有 cout,为什么还要利用日志呢?
无法否认,在利用像 C++、Java、PHP 这样的编程措辞时,我们会常常将打印到掌握台,由于这是开拓、测试和调试程序的一部分。但倘若我们正在处理一个做事端程序,却无法看到其内部发生了什么,这时该怎么办?唯一的可见性工具这天记文件,如果没有日志,我们就不能进行任何调试,也无法知道程序内部在做什么。
只管 C++ 中有相称方便的 cout 输出流,可以在掌握台上打印一些信息,或者可以通过其他办法将这些信息重定向到文件中,但这对付实际的运用程序来说根本不足。尤其对付繁芜的 C++ 程序来说,像 log4cplus 或任何其异日记框架能够供应了更多的灵巧性,而这是 cout 不可能完成的。
在编写代码时,利用日志框架是一种很好的实践。纵然像《代码整洁之道》这样的书本,也建议学习像 Log4j 这样的框架进行日志记录。以是,请尽可能的在生产代码中利用日志,而不是用 cout 来打印东西(这是不可接管的)。
利用日志的好处
日志是一个精良系统不可或缺的组成部分。
对付很多人来说,日志的浸染仅限于调试。实在不然,它在很多方面都非常有用:
日志是最好的的诊断工具绝大多数人都曾面临这样的困境——一旦程序涌现问题,很永劫光都找不出缘故原由!
短缺日志,我们将不得不依赖于客户或支持团队,让他们描述在什么情形下发生了什么(很可能会存在一些误导)。随后我们须要通过开拓环境重现问题,并进行各种调试,直至缺点修复为止,然而这一样平常会耗费很永劫光。但若有日志的帮助,我们便能迅速摆脱这种困境,可以很快地创造非常,并快速定位、办理问题!
随着项目规模的增加,模块会越来越多,调优也变成了一场持久战。
通过记录某些操作的日期和韶光,我们可以及时地检测模块的瓶颈,并针对性地对一些耗时操作做出优化。
日志有助于我们理解用户行为为了提高产品质量,供应个性化做事,就必须理解用户行为——他们做了什么,想要什么。
要搞清楚这些,当然要有数据,以是须要采集和剖析用户的行为,而日志无疑是最紧张的数据来源。
要不要重新发明轮子
不要去重新发明轮子——《麦肯锡方法》
不要发明轮子
既然已经对日志框架有了明确的理解,那么该当利用现有的日志框架,还是构建自己的日志框架呢?实在,这是一个旧调重弹的问题了——要不要重新发明轮子?引用莎士比亚戏剧《哈姆雷特》中的一句名言:
To be or not to be - that is the question.
现在我们正处于技能大爆发的时期,每一个技能领域中都有很多好的办理方案。因此,自己完备不须要、也不应该去写日志框架。就像不应该写版本掌握工具或 Bug 跟踪管理工具一样,其他人已经把这些东西搞出来了,而且搞的很好,Git、SVN,Bugzilla、Trac……搜罗万象,我们完备可以花很少的钱,乃至是免费利用它们。
以是,请避免重复劳动,不要去重新发明轮子。该当坚持在自己的领域办理问题,将韶光花在刀刃上。话虽如此,但我们还是须要理解关于轮子的一些细节(谁造的?怎么创造的?如何利用?),以从中接管灵感,并把自己的知识加进去。
因此,当须要一个日志框架时,该当利用现有的框架,而不是去重新发明轮子。那么,问题来了,日志框架都有哪些呢?
日志框架都有哪些
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。……这么多框架,该当选择哪一个呢?
由于每个人的需求和技能栈都不一样,以是很难直接回答这个问题,但是有一些选择标准可供参考。
日志选择标准易用性
易于利用的框架,能让你事半功倍。
易用性,是精良框架的一个主要特性。以是无论利用什么框架,都应优先考虑这一点。
对付日志框架而言,一旦当选定,在后期开拓过程中,项目组中的每个人都会频繁利用。如果易用性不好的话,那绝对是一个噩梦!
以是,在选择日志框架时,应只管即便找那些由大略、直不雅观的 API 实现的方案。一个大略日志框架,衡量标准可参考:对付缺少履历的团队成员,该当在查看文档和大略示例之后,就能够快速上手。
功能决定现在,性能决定未来。
另一个要考虑的主要成分是性能影响。正如上面提到的,我们会常常调用日志,这可能会对程序的性能产生巨大的影响。
想象一下,一个日志框架,须要花费很长的韶光才能启动,在每次调用时壅塞并实行文件 I/O,短缺缓冲机制……对付这样的框架,你会用吗?
因此,在评估日志框架时,可以参考网上的一些文章来比较,也可以自己做一些比较性实验(基准测试),例如:吞吐量——丈量每秒可以完成多少次方法调用(越高越好);采样——丈量每次调用实行究竟花费了多少韶光(越低越好)。
对现有代码的影响影响越小,越随意马虎掩护。
在往后的利用中,日志将无处不在。就像会影响运行时性能一样,它们也会影响源码的可掩护性。
从运用程序的角度来看,日志所处的位置比较尴尬。之以是这么说,是由于我们尽力隔离依赖性,供应良好的接口,并最小化耦合,在编程时考虑的是单一职责原则。然后日志涌现了,它到处都是,与周围的代码无关。与这些精良的设计原则比较,日志显得有些背道而驰。
社区支持每一个成功框架的背后,都有一个伟大的社区。
框架的生命力源于不断地完善和发展,如果没有强大的社区做支撑,这个框架便失落去了源动力。
因此,在选择框架时,这一点非常主要——所选的框架是否有专门的团队做支撑?在像 Stack Overflow 这样的问答网站上,它是否有很强的存在感?确保一点,如果在利用过程中碰着了问题,你能有办法快速办理。倘若选择了一个不有名的框架,当碰着了 Bug 时,那么可能会摧残浪费蹂躏大量的韶光来办理问题。
完全性完全的框架,铸就完美的生产力。
在最前面,我们将日志的功能分为三个紧张部分:日志记录、格式化和输出地,以是要确保所选的日志框架彻底办理了这些问题。
日志记录和输出地比较根本,险些所有日志框架都有这些观点。话虽如此,但对付好的框架来说,该当奥妙地将日志记录与输出地分开,并且还该当有多种可选的输出地。在空想情形下,最好能够自定义输出地。
一样平常情形下,格式化日志文件会整洁地排列,并具有很好的可读性。但在 DevOps 的天下里,这些远远不足。详细来说,日志文件须要被格式化为可解析的数据。通过将日志输出作为数据处理,可以很随意马虎地聚合、搜索和可视化日志,从而能够在生产支持方面助你一臂之力。以是,要确保日志框架拥有这种能力。
发展前景只有出息光明,方能大行其道。
无法绕过这一点——在选择日志框架时,不仅要考虑它的现状,还该当看重它的发展前景。
像上面提到的 C++ 日志框架,每一个都非常精良且特点光鲜。但有一些却得到了更多的关注度,例如 log4cplus、glog,为什么如此呢?由于它们有很强大的“基因”和“后台”,一个是著名的 Log4j 的衍生品,另一个则是 Google 的“亲儿子”。
一个框架的发展前景,取决于浩瀚成分——关注度、用户基数、社区生动度……要想大行其道,这些险些都不能少。
作者:一去、二三里,爱编程、爱分享、爱生活!
欢迎大家关注,更多优质原创内容敬请期待!
本文出自头条号【高师法式员】,VX "大众号同名。