我正在使用 Graylog 的 sidecar 功能和 Filebeat 从我的服务器中获取许多不同的日志文件,包括 Syslog、Nginx 和 Java App。所有这些都流入 Beats 的同一个 Graylog 输入(我尝试提供多个输入,但不幸的是 Filebeat 只发送到一个位置)。除了 Extractors 之外,一切都运行良好。
如何为特定日志消息指定特定提取器?例如:如果字段“类型”=“API”(我的 Java 应用程序),我想应用 JSON 提取器。如果类型 =“nginx”,则应用正则表达式提取器。
答案1
我在一个输入上采集多个日志源,并将 4 个提取器链接到它。从我观察到的行为来看,如果提取器无法匹配,它只会传递给下一个提取器。这只是一种尝试,而不是强制。
例如我的提取器:
- 解码 JSON(输入为 JSON,并将其展平为字段)
- 标准应用程序日志格式(我们使用内部标准)
- 应用程序的错误代码(如果出现错误,我们的应用程序将使用自定义的 Example_Error=Something 字段)
- Mac OS X 主机名
当应用程序日志没有错误时,它:
- 从 JSON 解码
- 通过 grok 和 RegEx 匹配格式
- 通过(无“Example_Error=”字段)
- 通过(与 Mac OS X 日志不匹配)
当 Mac OS X 系统日志进入时:
- 从 JSON 解码
- 通过(与应用程序日志格式不匹配)
- 通过(与错误代码字段不匹配)
- 提取主机名
通过一些规划和良好的 Grok 组合,您可以根据日志的预期格式将其与许多提取器配合使用。提取器中的“仅当字段包含(字符串/正则表达式)时才尝试提取”选项可能对您特别有用。
答案2
您可以以某种方式链接提取器,如果消息包含 API,则将消息复制到 api_message,然后在新字段上执行提取器。
对 nginx 等执行相同操作。