日志管理的最佳实践:利用日志更快地解决问题
2024年11月6日 | by mebius
作者:来自 ElasticLuca Wintergerst•David Hope•Bahubali Shetti
探索有效的日志管理策略,以提高系统可靠性和性能。了解复杂软件环境中日志的数据收集、处理、分析和经济高效的管理。
在当今快速发展的软件开发环境中,高效的日志管理对于维护系统可靠性和性能至关重要。随着基础架构和应用程序组件的不断扩展和复杂化,运营和开发团队的职责也不断增加且越来越复杂。这篇博文概述了有效日志管理的最佳实践,以应对数据量不断增长、基础架构复杂以及快速解决问题的需求等挑战。
了解日志及其重要性
日志是基础设施内发生的事件的记录,通常包括时间戳、详细说明事件的消息以及标识来源的元数据。它们对于诊断问题、提供早期警告和加快问题解决速度非常有用。日志通常是开发人员启用的主要信号,为调试、性能分析、安全性和合规性管理提供重要详细信息。
日志记录之旅
日志记录之旅涉及三个基本步骤:收集和提取、处理和丰富以及分析和合理化。让我们详细探讨每个步骤,并介绍每个部分的一些最佳实践。
1. 日志收集和提取
收集所有相关且可操作的信息
第一步是将所有日志收集到一个中心位置。这涉及识别所有应用程序和系统并收集其日志。全面的数据收集可确保不会遗漏任何关键信息,从而提供系统行为的完整画面。如果发生事故,将所有日志集中在一个地方可以显著缩短解决问题的时间。通常,收集比所需更多的数据会更好,因为你以后总是可以过滤掉不相关的信息,以及更快地删除不再需要的日志。
利用集成(integration)
Elastic 提供 300 多个集成,可简化数据导入。这些集成不仅可以收集数据,还附带仪表板、已保存的搜索和用于解析数据的管道。利用这些集成可以显著减少手动工作量并确保数据一致性。
考虑提取容量和成本
日志收集的一个重要方面是确保你拥有足够的提取容量和可控的成本。在评估解决方案时,请谨慎选择那些对高基数数据(high cardinality data)收费更高的解决方案,因为这可能会导致可观察性解决方案的成本出乎意料地高。我们将在本文后面讨论更具成本效益的日志管理。
将 Kafka 用于大型项目
对于较大的组织,实施 Kafka 可以改善日志数据管理。Kafka 充当缓冲区,使系统更可靠、更易于管理。它允许不同的团队将数据发送到集中位置,然后可以将其提取到 Elastic 中。
2. 处理和丰富
采用 Elastic Common Schema (ECS)
日志收集的一个关键方面是在所有应用程序和基础设施中进行最大程度的规范化。拥有一个通用的语义模式至关重要。Elastic 向 OpenTelemetry (OTel) 贡献了 Elastic Common Schema (ECS),帮助加速采用基于 OTel 的可观察性和安全性。这种朝着更规范化的方式定义和提取日志(包括指标和跟踪)的举措对行业有益。
使用 ECS 有助于标准化字段名称和数据结构,使数据分析和关联更容易。这种通用模式可确保你的数据以可预测的方式组织,从而促进更高效的查询和报告。在此处了解有关 ECS 的更多信息。
优化大容量数据的映射
对于高基数字段或很少使用的字段,请考虑优化或从索引中删除它们。这可以通过减少需要索引和搜索的数据量来提高性能。我们的文档中有部分内容可帮助你调整磁盘使用率、搜索速度和索引速度的设置。
管理结构化日志与非结构化日志
结构化日志通常更受欢迎,因为它们提供更多价值并且更易于使用。它们具有预定义的格式和字段,简化了信息提取和分析。对于没有预构建集成的自定义日志,你可能需要定义自己的解析规则。
对于非结构化日志,全文搜索功能可以帮助缓解限制。通过索引日志,全文搜索允许用户高效地搜索特定关键字或短语,即使在大量非结构化数据中也是如此。这是 Elastic 可观察性解决方案的主要区别之一。你可以简单地搜索任何关键字或短语并实时获得结果,而无需在查询时编写复杂的正则表达式或解析规则。
读取时模式与写入时模式(Schema-on-Read vs. Schema-on-Write)
处理日志数据有两种主要方法:
- 读取时模式:一些可观察性仪表板功能可以执行运行时转换,以动态从未解析的源中提取字段。这在处理tgcode可能不以标准格式记录数据的旧系统或自定义应用程序时非常有用。但是,运行时解析可能非常耗时且耗资源,尤其是对于大量数据。
- 写入时模式:这种方法提供更好的性能和对数据的更多控制。模式是预先定义的,数据在写入时进行结构化和验证。这允许更快地处理和分析数据,这对丰富数据大有裨益。
3. 分析和合理化
全文搜索
Elastic 的全文搜索功能由 Elasticsearch 提供支持,可让你快速找到相关日志。Kibana 查询语言 (KQL) 可提高搜索效率,使你能够筛选和深入研究数据以快速识别问题。
以下是一些 KQL 查询示例:
// Filter documents where a field exists
http.request.method: *
// Filter documents that match a specific value
http.request.method: GET
// Search all fields for a specific value
Hello
// Filter documents where a text field contains specific terms
http.request.body.content: "null pointer"
// Filter documents within a range
http.response.bytes 10000 and http.response.bytes
机器学习集成
机器学习可以自动检测日志数据中的异常和模式。Elastic 提供日志速率分析等功能,可自动识别与正常行为的偏差。通过利用机器学习,你可以在潜在问题升级之前主动解决它们。
建议组织利用各种机器学习算法和技术来有效地发现日志文件中的未知未知数(unknown-unknowns)。应采用无监督机器学习算法来对实时数据进行异常检测,并根据严重程度进行速率控制警报。
通过自动识别影响因素,用户可以获得有价值的背景信息,以进行自动根本原因分析 (root cause analysis – RCA)。日志模式分析为非结构化日志带来分类,而日志速率分析和变化点检测有助于识别日志数据激增的根本原因。
查看文档以开始使用 Elastic 中的机器学习。
仪表板和警报
构建仪表板和设置警报可帮助你实时监控日志。仪表板以可视化方式呈现你的日志,让你更轻松地识别模式和异常。警报可在特定事件发生时通知你,让你快速采取行动。
经济高效的日志管理
使用数据层
实施索引生命周期管理以在热层、温层、冷层和冻结层之间移动数据可以显著降低存储成本。这种方法可确保只有最常访问的数据才存储在昂贵的高性能存储中,而较旧的数据则移动到更具成本效益的存储解决方案中。
我们的文档解释了如何设置索引生命周期管理。
压缩和索引排序
应用最佳压缩设置并使用索引排序可以进一步减少数据占用空间。优化数据存储在磁盘上的方式可以大幅节省存储成本并提高检索性能。从 8.15 开始,Elasticsearch 提供了一种名为 “logsdb” 的索引模式。这是一种高度优化的存储日志数据的方式。这种新的数据索引方式使用的磁盘空间比默认模式少 2.5 倍。 你可以在此处阅读更多相关信息。此模式会自动应用压缩、索引排序和其他优化的最佳设置组合,而这些优化以前是用户无法访问的。
快照生命周期管理 (Snapshot Lifecycle Management – SLM)
SLM 允许你备份数据并将其从主集群中删除,从而释放资源。如果需要,可以快速恢复数据进行分析,确保你能够调查历史事件,而无需承担高昂的存储成本。
在文档中了解有关 SLM 的更多信息。
处理大量日志数据
管理大量日志数据可能具有挑战性。以下是一些优化日志管理的策略:
- 制定日志删除策略。评估要收集哪些数据以及何时删除这些数据。
- 考虑尽早丢弃 DEBUG 日志甚至 INFO 日志,并尽早删除开发和暂存环境(staging environment)日志。
- 聚合相同日志行的短窗口,这对于 TCP 安全事件日志记录特别有用。
- 对于你控制的应用程序和代码,请考虑将一些日志移入跟踪以减少日志量,同时保留详细信息。
集中式与分散式日志存储
数据局部性是管理日志数据时的一个重要考虑因素。输入和输出大量日志数据的成本可能高得令人望而却步,尤其是在与云提供商打交道时。
在没有区域冗余要求的情况下,你的组织可能不需要将所有日志数据发送到中央位置。考虑将日志数据保存在生成它的数据中心本地,以减少输入和输出成本。
跨集群搜索(Cross-cluster search)功能使用户能够同时跨多个日志集群进行搜索,从而减少需要通过网络传输的数据量。
跨集群复制(Cross-cluster replication)对于在发生灾难时保持业务连续性非常有用,即使在一个数据中心发生中断时也能确保数据可用性。
监控和性能
监控你的日志管理系统
使用专用监控集群可以帮助你跟踪 Elastic 部署的性能。堆栈监控提供有关搜索和索引活动的指标,帮助你识别和解决性能瓶颈。
调整批量大小和刷新间隔
优化这些设置可以平衡性能和资源使用情况。增加批量大小和刷新间隔可以提高索引效率,尤其是对于高吞吐量环境。
日志记录最佳实践
调整日志级别
确保为所有应用程序适当设置日志级别。自定义日志格式以方便提取和分析。正确配置的日志级别可以减少噪音,并更容易识别关键问题。
使用现代日志记录框架
实施支持结构化日志记录的日志记录框架。向日志添加元数据可增强其分析的实用性。结构化日志记录格式(例如 JSON)允许轻松解析和查询日志,从而提高日志分析的效率。如果你完全控制应用程序并且已经在使用结构化日志记录,请考虑使用这些库的 Elastic 版本,它可以自动将日志解析为 ECS 字段。
利用 APM 和指标
对于定制应用程序,应用程序性能监控 (Application Performance Monitoring – APM) 可提供对应用程序性能的更深入了解,补充传统日志记录。APM 跟踪跨服务的 transactions,帮助你了解依赖关系并识别性能瓶颈。
考虑在收集日志的同时收集指标。指标可以提供有关系统性能的见解,例如 CPU 使用率、内存使用率和网络流量。如果你已经从系统中收集日志,则添加指标收集通常是一个快速的过程。
跟踪(traces)可以提供有关特定事务或请求路径的更深入见解,尤其是在云原生环境中。它们提供更多上下文信息,并且擅长跟踪跨服务的依赖关系。但是,只有你拥有的应用程序才能实现跟踪,而且并非所有开发人员都完全接受它。
建议使用组合日志记录和跟踪策略,其中跟踪为较新的已检测应用程序提供覆盖范围,日志记录支持你不拥有源代码的旧式应用程序和系统。
结论
有效的日志管理对于在当今复杂的软件环境中保持系统可靠性和性能至关重要。通过遵循这些最佳实践,你可以优化日志管理流程、降低成本并缩短问题解决时间。
关键要点包括:
- 确保全面收集日志,重点关注规范化和通用架构。
- 使用适当的处理和丰富技术,在结构化和非结构化日志之间取得平衡。
- 利用全文搜索和机器学习进行高效的日志分析。
- 实施经济高效的存储策略和智能数据保留策略。
- 使用 APM、指标和跟踪增强你的日志记录策略,以获得完整的可观察性解决方案。
不断评估和调整你的策略以跟上不断增长的日志数据量和复杂性,你将能够确保应用程序和基础设施的可靠性、性能和安全性。
查看我们的其他博客:
- 从日志和指标构建更好的服务级别目标 (SLO)
- 使用 Elastic 中的 tgcodeGenAI 进行 AWS VPC Flow 日志分析
- 将 10 亿条日志行从 OpenSearch 迁移到 Elasticsearch
- 使用 Elastic 修剪传入的日志量
准备好开始了吗?使用 Elastic Cloud 上的 Elastic Observability — 包含所有最新功能的托管 Elasticsearch 服务。
本文中描述的任何特性或功能的发布和时间均由 Elastic 自行决定。任何当前不可用的特性或功能可能无法按时交付或根本无法交付。
文章来源于互联网:日志管理的最佳实践:利用日志更快地解决问题