日志异常检测 - Amazon CloudWatch Logs

日志异常检测

您可以通过两种方式检测日志数据中的异常:创建日志异常检测器以进行持续监控,或者在 CloudWatch Logs Insights 查询中使用anomaly detection命令进行按需分析。

日志异常检测器会扫描摄取到日志组中的日志事件,并自动查找日志数据中的异常。异常检测使用机器学习和模式识别来建立典型日志内容的基准。对于按需分析,您可以使用 CloudWatch Logs Insights 查询中的anomaly detection命令来识别时间序列数据中的异常模式。有关基于查询的异常检测的更多信息,请参阅在 CloudWatch Logs Insights 中使用异常检测

在为日志组创建异常检测器后,它使用日志组中过去两周的日志事件进行训练。训练时间可能长达 15 分钟。训练完成后,它会开始分析传入的日志以识别异常,并将异常显示在 CloudWatch Logs 控制台中供您检查。

CloudWatch Logs 模式识别通过识别日志中的静态和动态内容来提取日志模式。模式对于分析大型日志集很有用,因为大量日志事件通常可压缩成几个模式。

例如,请参阅以下三个日志事件示例。

2023-01-01 19:00:01 [INFO] Calling DynamoDB to store for ResourceID: 12342342k124-12345 2023-01-01 19:00:02 [INFO] Calling DynamoDB to store for ResourceID: 324892398123-1234R 2023-01-01 19:00:03 [INFO] Calling DynamoDB to store for ResourceID: 3ff231242342-12345

在上面的示例中,所有三个日志事件都遵循一种模式:

<Date-1> <Time-2> [INFO] Calling DynamoDB to store for resource id <ResourceID-3>

模式内的字段称为令牌。模式内变化的字段(如请求 ID 或时间戳)称为动态令牌。为动态令牌找到的每个不同值称为令牌值

如果 CloudWatch Logs 可以推断动态令牌所代表的数据类型,它会将该令牌显示为 <string-number>字符串是令牌所代表的数据类型的描述。数字显示了与其他动态令牌相比,此令牌在模式中的出现位置。

CloudWatch Logs 根据分析包含该名称的日志事件的内容来分配名称的字符串部分。

如果 CloudWatch Logs 无法推断动态令牌所代表的数据类型,则会将令牌显示为 <Token-数字>,数字 表示此令牌与其他动态令牌相比在模式中出现的位置。

动态令牌的常见示例包括错误代码、IP 地址、时间戳以及请求 ID。

日志异常检测使用这些模式来查找异常。异常检测器模型训练期结束后,将根据已知趋势对日志进行评估。异常检测器将显著的波动标记为异常。

本章介绍了如何启用异常检测、查看异常、为日志异常检测器创建警报以及日志异常检测器发布的指标。它还介绍了如何使用 AWS Key Management Service 对异常检测器及其结果进行加密。

创建日志异常检测器不会产生费用。

异常和模式的严重性和优先级

日志异常检测器发现的每个异常都分配有优先级。发现的每种模式都分配有严重性

  • 优先级是自动计算的,它基于模式的严重性级别以及与预期值的偏差量。例如,如果某个令牌值突然增加 500%,则即使异常的严重性为 NONE,也可能会被指定为 HIGH 优先级。

  • 严重性仅基于模式中找到的关键字,例如 FATALERRORWARN。如果未找到这些关键字,则模式的严重性将标记为 NONE

异常可见性时间

创建异常检测器时,请为其指定最长异常可见性期限。这是异常在控制台中显示并由 ListAnomalies API 操作返回的天数。在异常经过此时间段后,如果异常继续发生,则会自动接受为正常行为,并且异常检测器模型会停止将其标记为异常。

如果在创建异常检测器时不调整可见性时间,则默认使用 21 天。

抑制异常

发现异常后,您可以选择暂时或永久抑制它。抑制异常会导致异常检测器在您指定的时间内停止将此事件标记为异常。抑制异常时,您可以选择仅抑制该特定异常,或抑制与发现异常的模式相关的所有异常。

您仍然可以在控制台中查看被抑制的异常。您也可以选择停止抑制它们。

常见问题

AWS 是否会使用我的数据来训练机器学习算法以供 AWS 或其他客户使用?

否。训练创建的异常检测模型基于日志组中的日志事件,并且仅在该日志组和该 AWS 账户内使用。

哪些类型的日志事件适合进行异常检测?

日志异常检测适用于:应用程序日志和其他类型的日志,其中大多数日志条目符合典型模式。事件包含日志级别或严重性关键字(如 INFOERRORDEBUG)的日志组尤其适合日志异常检测。

日志异常检测不适用于:具有极长 JSON 结构的日志事件,例如 CloudTrail 日志。模式分析仅分析日志行的前 1500 个字符,因此超出该限制的任何字符都将被跳过。

审计或访问日志(如 VPC 流日志)在异常检测方面的成功率也较低。异常检测旨在发现应用程序问题,因此它可能不太适合网络或访问异常。

为了帮助确定异常检测器是否适用于某个日志组,请使用 CloudWatch Logs 模式分析来查找该组中日志事件中的模式数量。如果模式的数量不超过 300 个,则异常检测可能会效果良好。有关模式分析的更多信息,请参阅 模式分析

什么会被标记为异常?

以下情况可能会导致日志事件被标记为异常:

  • 具有日志组中以前未见过的模式的日志事件。

  • 已知模式的显著变化。

  • 具有一组离散的常用值的动态令牌的新值。

  • 动态令牌的值出现次数的大幅变化。

虽然上述所有项都可能被标记为异常,但它们并不一定意味着应用程序性能不佳。例如,高于平常的 200 个成功值可能会被标记为异常。在这种情况下,您可以考虑抑制这些不表示问题的异常。

被屏蔽的敏感数据会发生什么情况?

日志事件中被屏蔽为敏感数据的任何部分都不会进行异常扫描。有关屏蔽敏感数据的更多信息,请参阅通过屏蔽帮助保护敏感的日志数据