一文详解 C++ 框架:日志框架

何为日志框架

日志框架:一个经过专门设计的实用程序 , 用于规范应用程序的日志记录过程 。
日志框架可以自己编写(技术要牛才行哦) , 也可以由第三方(例如:log4cplus)提供 。对于不同的日志框架 , 各自的组织在实现方式上也有所不同 。
虽然可以简单地“标准化”日志(例如:调用文件系统 API , 将信息写入名为 log.txt 的文件) , 但是要成为一个严格意义上的框架 , 必须要超越标准化 。也就是说 , 日志框架必须通过处理日志记录来标准化解决方案 , 从而暴露一个标准的 API 。
没明白?那就再具体一些 , 设想一个日志框架 , 封装了三个主要部分:
一文详解 C++ 框架:日志框架

文章插图
主要组成
当想要捕获程序的运行时信息时 , 首先要发出要记录的信息 。然后 , 格式化这些信息 。最后 , 决定将它输出到哪里 。一般情况下 , 会输出到文件中 , 但是也可以将其输出到控制台、数据库 , 或者任何能够接收数据的地方 。
如果有一系列代码 , 能够解决这些问题 , 那么就可以被看作是一个日志框架 。
 
为什么不是 cout
使用日志 , 只为成为更好的攻城狮 。
也许有人会问:既然 C++ 中有 cout , 为什么还要使用日志呢?
无法否认 , 在使用像 C++、JAVA、php 这样的编程语言时 , 我们会经常将消息打印到控制台 , 因为这是开发、测试和调试程序的一部分 。但倘若我们正在处理一个服务端程序 , 却无法看到其内部发生了什么 , 这时该怎么办?唯一的可见性工具是日志文件 , 如果没有日志 , 我们就不能进行任何调试 , 也无法知道程序内部在做什么 。
尽管 C++ 中有相当方便的 cout 输出流 , 可以在控制台上打印一些信息 , 或者可以通过其他方式将这些信息重定向到文件中 , 但这对于实际的应用程序来说根本不够 。尤其对于复杂的 C++ 程序来说 , 像 log4cplus 或任何其他日志框架能够提供了更多的灵活性 , 而这是 cout 不可能完成的 。
在编写代码时 , 使用日志框架是一种很好的实践 。即使像《代码整洁之道》这样的书籍 , 也建议学习像 Log4j 这样的框架进行日志记录 。所以 , 请尽可能的在生产代码中使用日志 , 而不是用 cout 来打印东西(这是不可接受的) 。
 
使用日志的好处
日志是一个优秀系统不可或缺的组成部分 。
对于很多人来说 , 日志的作用仅限于调试 。其实不然 , 它在很多方面都非常有用:
  • 日志是最好的的诊断工具
绝大多数人都曾面临这样的困境——一旦程序出现问题 , 很长时间都找不出原因!
缺少日志 , 我们将不得不依赖于客户或支持团队 , 让他们描述在什么情况下发生了什么(很可能会存在一些误导) 。随后我们需要通过开发环境重现问题 , 并进行各种调试 , 直至错误修复为止 , 然而这一般会耗费很长时间 。但若有日志的帮助 , 我们便能迅速摆脱这种困境 , 可以很快地发现异常 , 并快速定位、解决问题!
  • 日志让我们有机会检测模块的瓶颈
随着项目规模的增加 , 模块会越来越多 , 调优也变成了一场持久战 。
通过记录某些操作的日期和时间 , 我们可以及时地检测模块的瓶颈 , 并针对性地对一些耗时操作做出优化 。
  • 日志有助于我们了解用户行为
为了提高产品质量 , 提供个性化服务 , 就必须了解用户行为——他们做了什么 , 想要什么 。
要搞清楚这些 , 当然要有数据 , 所以需要采集和分析用户的行为 , 而日志无疑是最主要的数据来源 。
 
要不要重新发明轮子
不要去重新发明轮子——《麦肯锡方法》

一文详解 C++ 框架:日志框架

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


推荐阅读