日志库的意义和目的是什么?

What is the meaning and purpose of a logging library?

我想了解日志库的基础知识。

  1. 日志库的确切用途是什么?我了解日志基本上是有关您的应用程序在执行过程中的信息。一种方法是直接在文件中写入信息。
  2. 设计诸如 glog 之类的专用库用于日志记录的目的是什么? 我对日志记录的理解是否正确,或者我是否需要更改它? 有人可以举一个实际的例子来说明使用日志库的重要性吗?
  3. 选择日志记录库时应注意哪些功能?
  4. 如何在实施过程中有效地使用日志记录?

在您的应用程序执行期间记录信息可以帮助您了解导致错误或崩溃的原因,为您提供比仅从崩溃报告、调用堆栈甚至小型转储中获得的更多上下文。当您从非开发人员且未在调试器下 运行 获得错误或崩溃报告时,这一点尤为重要,无论是最终用户/客户还是您团队中的非开发人员。

我的背景是游戏,由于某些原因,日志记录对游戏特别有价值。一是许多问题可能与系统硬件的具体细节有关,因此记录信息(例如用户拥有哪种 GPU、他们使用的是哪个图形驱动程序版本 运行ning 等)对于调试问题至关重要仅显示在特定配置上。另一个是游戏有一个模拟方面,游戏的状态随着时间的推移而演变,以响应用户输入以及物理、人工智能和游戏规则等事物的模拟。了解 运行 发生崩溃或错误时发生的情况有助于弄清楚如何重现它,并可以为问题的根本原因提供有价值的线索。

日志库添加了对日志记录有用的功能,并且超出了简单 printf 的功能。这包括:

  • 能够根据调试与发布版本等因素控制日志记录量,运行时间设置(如 -verbose 标志)。
  • 'channels' 的概念可以独立启用、禁用或设置为特定的详细程度。例如,要调试图形问题,您可能希望将 'graphics' 通道设置为最大详细程度,同时将 'network' 和 'audio' 通道静音。
  • 一个灵活的后端,范围从记录到磁盘上的本地文件到通过网络记录到远程数据库。
  • 线程安全,因此当可能从多个不同线程同时记录时,记录会自行运行。
  • 使用时间戳和任何其他相关信息(通道、详细级别等)自动标记日志条目。

至于如何使用日志库,这在某种程度上取决于您的应用程序,但这里有一些一般性建议:

  • 如果您的日志库提供(并且应该),请充分利用通道和详细级别。这将帮助您管理随着应用程序的增长可能会变成大量日志消息的内容。
  • 如果您遇到意外但非致命的情况并进行了处理,请记录一些相关信息,以防日后导致无法预料的问题。
  • 在应用程序启动时,如果您收到来自客户的错误或崩溃报告,请记录可能有助于稍后重现罕见错误的任何信息。宁愿信息太多,你也永远不知道事先可能有用的信息。这可能包括 CPU 类型、GPU 型号和驱动程序版本、可用内存、OS 版本、可用硬盘 space 等
  • 记录关键状态转换,以便您可以跟踪您的应用程序所处的状态以及在调试问题时它是如何到达那里的。

很多程序都使用某种日志记录,即使代码相对简单,每次都重新发明轮子也没有什么意义。

其他库也可以使用日志库,因此不必为项目中包含的每个库配置日志文件,只需配置一个日志库即可。这也意味着任何可能出现在日志记录代码中的错误都可以通过替换一个库来修复,而不必替换多个库。

最后,它使其他开发人员更容易阅读代码,因为他们不必弄清楚您是如何实现自定义日志记录的。