日志记录可以说是可观测性解决方案中最重要的元素。日志提供有关系统行为的基础且丰富的信息。在理想的情况下,您将做出有关日志记录的所有决策,并在整个系统中实施一致的方法。
然而,在现实世界中,您可能会使用遗留软件或处理不同的编程语言、框架和开源包,每种语言、框架和开源包都有自己的日志记录格式和结构。
由于系统中的日志格式如此多样化,您可以采取哪些步骤来从所有日志中提取最大价值?这就是我们将在这篇文章中介绍的内容。
我们将了解如何设计日志、大型系统中日志记录的挑战和解决方案,以及如何考虑基于日志的指标和长期保留。
让我们深入了解一下日志级别和格式。
日志设计需要考虑很多因素,但最重要的两个方面是日志级别的使用以及是否使用结构化或非结构化日志格式。
日志级别用于根据日志消息的严重性对日志消息进行分类。使用的具体日志级别可能会有所不同,具体取决于日志记录框架或系统。但是,常用的日志级别包括(按照详细程度从最高到最低的顺序):
在适当的级别进行日志记录有助于了解系统的行为、识别问题并有效地解决问题。
当涉及到您构建的系统组件时,我们建议您花一些时间来定义有用的日志级别集。了解每个日志级别的消息中应包含哪些类型的信息,并一致地使用日志级别。
稍后,我们将讨论如何处理第三方应用程序,您无法控制日志级别。我们还将研究您控制的遗留应用程序,但它们过于庞大而无法迁移到标准日志级别。
结构化日志中的条目具有明确定义的格式,通常为键值对或 JSON 对象。这允许一致且机器可读的日志条目,从而更容易以编程方式解析和分析日志数据。
结构化日志记录支持高级日志查询和分析,使其在大型系统中特别有用。
另一方面,非结构化(自由格式)日志记录以更易于理解的格式捕获消息,没有预定义的结构。这种方法允许开发人员更自然、更灵活地记录消息。
然而,以编程方式从结果日志中提取特定信息可能非常具有挑战性。
在结构化日志和非结构化日志之间进行选择取决于您的具体需求以及系统的要求和约束。如果您预计需要高级日志分析或与日志分析工具集成,结构化日志可以提供显着的好处。
但是,如果您需要的只是简单性和可读性,那么非结构化日志可能就足够了。
在某些情况下,还可以使用混合方法,即对重要事件使用结构化日志,对更一般的消息使用非结构化日志。
对于大型系统,您应该尽可能倾向于结构化日志记录,但请注意,这会为您的规划增加另一个维度。对结构化日志消息的期望是同一组字段将在系统组件中一致使用。这需要战略规划。
对于包含多个组件的系统,每个组件很可能都有自己的模型来管理其日志。让我们回顾一下这带来的挑战。
组件将记录到不同的目的地——文件、系统日志、stdout 或 stderr。在分布式系统中,收集这些分散的日志以进行有效利用是很麻烦的。
为此,您需要采用多样化的日志收集方法,例如使用来自 Sumo Logic 的已安装收集器和托管收集器。
某些组件将使用非结构化、自由格式的日志记录,不遵循任何特定格式。同时,结构化日志可能更有条理,但具有结构化日志的组件可能会采用完全不同的字段集。
统一从各种日志和格式中获得的信息需要正确的工具。
系统中的组件可能使用不同范围的日志级别。即使您将所有日志消息合并到集中式日志系统中(正如您应该的那样),您也需要处理所有日志级别的并集。
出现的一项挑战是何时应该对不同的日志级别进行相同的处理。例如,一个组件中的错误可能与另一组件中的严重错误相同,需要立即升级。
当不同组件中的相同日志级别意味着不同的事情时,您将面临相反的挑战。例如,一个组件中的 INFO 消息对于理解系统状态可能至关重要,而在另一组件中它们可能过于冗长。
大型分布式系统会积累大量日志。收集和存储这些日志并不便宜。云中与日志相关的成本可能占系统总成本的很大一部分。
虽然大型分布式系统中的日志记录面临着巨大的挑战,但可以通过以下一些实践找到解决方案。
当您运行分布式系统时,您应该使用集中式日志记录解决方案。当您在系统中的每台计算机上运行日志收集代理时,这些收集器会将所有日志发送到您的中央可观察平台。
Sumo Logic 始终专注于日志管理和分析,在日志聚合方面是同类中最好的。
如果您想要关联日志数据以进行跨应用程序和组件的分析和故障排除,那么处理不同格式的日志是一个大问题。一种解决方案是将不同的日志转换为统一的格式。
此任务的工作量可能很高,因此请考虑分阶段执行此任务,从最重要的组件开始,然后逐步完成。
对于您自己的应用程序,努力建立一种标准日志记录方法,该方法采用一组统一的日志级别、单一的结构化日志格式和一致的语义。
如果您还有遗留应用程序,请评估与迁移它们以遵守您的标准相关的风险和成本级别。
如果迁移不可行,请像对待第三方应用程序一样对待您的旧应用程序。
丰富来自第三方来源的日志涉及使用来自外部系统或服务的上下文信息来增强日志数据。这可以更好地理解日志事件,有助于故障排除、分析和监控活动。
为了丰富您的日志,您可以集成外部系统(例如 API 或消息队列)来获取与日志事件相关的补充数据(例如用户信息、客户详细信息或系统指标)。
仔细管理日志量、频率和保留对于高效的日志管理和存储至关重要。
通过分析日志数据得出的指标可以深入了解系统行为和性能。使用基于日志的指标有其优点和挑战。
定义有意义的指标:由于所有组件中可用的指标集非常庞大,并且捕获所有指标是没有意义的,因此确定要捕获并从日志中提取哪些指标可能是一项复杂的任务。
这种识别需要深入了解系统行为并与您的业务目标紧密结合。
数据提取和解析:解析日志以提取有用的指标可能需要专门的工具或自定义解析器。如果日志是非结构化的或从一个组件到下一个组件的格式不一致,则尤其如此。
设置此功能可能非常耗时,并且随着日志格式的更改或新日志源的出现,可能需要维护。
在集中式系统中进行日志聚合之后,您仍然需要考虑长期日志保留策略。让我们讨论一下该领域的关键问题。
您应该保留日志多长时间取决于几个因素,包括:
当然,删除旧日志是降低存储成本的最简单方法。但是,这可能有点严厉,有时您可能希望保留旧日志中的信息。
当您想要保留旧日志中的信息,同时又想要经济高效时,请考虑采取以下一些措施:
在本文中,我们研究了如何在大型系统中充分利用日志记录。
尽管这些系统中的日志记录提出了一系列独特的挑战,但我们已经研究了这些挑战的潜在解决方案,例如日志聚合、将日志转换为统一格式以及使用第三方来源的数据丰富日志。
日志记录是可观察性的关键部分。通过遵循本文中概述的实践,您可以确保有效管理日志,从而能够解决问题、识别问题并深入了解系统的行为。
而且您可以在保持伐木成本的同时做到这一点。
也发布在这里