接下来我们将讨论使用应用程序记录的日志信息。日志的概念并不是第一次出现在软件中。几个世纪以来,人们使用日志来帮助他们了解过去的事件和过程。自从文字被发明以来,人们就一直在使用日志,而且我们今天仍然在使用它。所有的船支都有日志。水手们记录决策(方向、速度增减等)和给出或收到的命令,以及任何遇到的事件(图1)。如果船上的设备发生了问题,他们可以通过航海日志的记录来了解自己的位置,并导航到最近的岸边。如果发生了事故,航海日志的记录可以在调查中使用,以确定如何避免不幸的事件。 图1 如果你看过一盘棋,你就会知道双方都会写下每个棋子的移动。为什么?这些日志可以帮助他们在事后重新创造整个棋局。他们研究自己和对手的动作,以发现潜在的错误或漏洞。 出于类似的原因,应用程序也会记录日志信息。我们可以利用这些信息来了解一个应用程序执行时发生了什么。通过阅读日志信息,你可以重新创建执行过程,就像国际象棋选手重新创建一盘棋一样。当我们调查一个奇怪的或不需要的行为或更多难以看到的问题(如安全漏洞)时,我们可以使用日志。 我相信你已经知道日志是什么样子的了。你已经看到了日志信息,至少在用IDE运行你的应用程序时是如此(图2)。所有的IDE都有一个日志控制台。这是所有软件开发者最先学会的东西之一。但一个应用程序并不只是在IDE的控制台中显示日志信息。现实世界中的应用程序会存储日志,以使开发者能够在特定时间调查特定的应用程序行为。 图2 图3显示了一个标准格式的日志消息的结构。日志消息只是一个字符串,所以理论上它可以是任何句子。然而,干净和易于使用的日志需要遵循一些最佳实践(你将在本章中学习)。例如,除了描述之外,日志消息还包含应用程序写消息的时间戳、对严重程度的描述,以及写消息的应用程序部分的符号(图3)。 图3 在许多情况下,日志是调查一个应用程序行为的非常有效方式。一些例子包括以下:调查一个事件或已经发生的事件的时间线调查干扰应用程序改变应用程序行为的问题(Heisenbugs)。了解应用程序的长期行为对需要立即关注的关键事件发出警报 在调查一个特定的应用能力的行为方式时,我们一般不会只使用一种技术。根据不同的场景,开发人员可能会结合几种技术来理解一个特定的行为。在某些情况下,你会使用带有日志的debugger以及其他技术来弄清楚为什么某些东西以这样的方式工作。 我总是建议开发者在调查一个问题时,在做其他事情之前先检查日志(图4)。日志通常可以让你立即识别出奇怪的行为,帮助你确定从哪里开始调查。日志不一定能回答你所有的问题,但有一个起点是非常重要的。如果日志信息告诉你从哪里开始,你就已经节省了大量的时间 图4 在我看来,日志不仅仅是极有价值的,事实上,它们对任何应用程序来说都是不可或缺的。在下篇文章中,我们将讨论如何使用日志,并学习典型的调查场景,其中日志是必不可少的。接着在下下篇中,你将学习如何在你的应用程序中正确实现日志功能。我们将讨论使用日志级别来帮助你更容易过滤事件和日志引起的问题和讨论使用日志和远程调试的区别。 我还推荐你阅读PhilWilkins写的《LogginginAction》(Manning,2022)的第四部分。这一章更侧重于用日志的调查技术,而LogginginAction则更深入地探讨日志的技术问题。你还会发现使用与Java不同的语言(Python)演示的日志。