【问题标题】:Logstash rsyslog + apacheLogstash rsyslog + apache
【发布时间】:2015-09-20 16:37:06
【问题描述】:

我想使用 rsyslog 来检索 apache 日志并使用 Logstash 处理它们

日志在 rsyslog 中很受欢迎,然后在 logstash 中,但我想从 rsyslog 的消息部分提取 apache 日志文件的内容。

例如,这里是在 logstash 中收到的行。最后一部分是apache日志。

2015-09-20T16:27:30.000Z 1.1.20.133 <173>Sep 20 16:27:30 ip-12-1-8-7 apache[26914]: 10.25.52.66 - - [20/Sep/2015:16:27:30 +0000] "GET / HTTP/1.1" 200 - "-" "Dalvik/1.6.0 (Linux; U; Android 4.2.2; MID Build/JDQ39)" "-"

我想提取 apache 部分,然后再次解析。

10.25.52.66 - - [20/Sep/2015:16:27:30 +0000] "GET / HTTP/1.1" 200 - "-" "Dalvik/1.6.0 (Linux; U; Android 4.2.2; MID Build/JDQ39)" "-"

我猜如何使用 grok 来做到这一点。是否可以使用 grok 进行第一次过滤以识别 syslog,提取 syslog 消息,然后将其解析为 apache 日志。

用于提取 rsyslog 的过滤器如下:

filter {
  grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
   }
}

现在,我如何使用 syslog_message 来提取 apache 数据。我是否需要执行单个 grok 匹配命令,或者我可以分两步执行此操作:提取 syslog 数据,并使用 grok/过滤 apache 行

以下方法有效,但我想知道是否有更好的方法来避免重复:

filter {
 if [type] == "syslog" {
   grok {
     match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
     add_field => [ "received_at", "%{@timestamp}" ]
     add_field => [ "received_from", "%{host}" ]
   }
   grok {
     match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}  ${COMBINEDAPACHELOG}" }
   }
  }
}

【问题讨论】:

    标签: logstash rsyslog logstash-grok


    【解决方案1】:

    你很亲密!

    在第二个 grok 中,您应该使用 syslog_message 字段作为您的输入,并且只使用 COMBINEDAPACHELOG 作为您的模式。

    正如您所做的那样,这是使用 grok 对字段进行后处理以从中提取更多信息的好方法。

    由于日志文件只有一种格式,因此您也可以将这两种 grok 合二为一:

     match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{COMBINEDAPACHELOG}" }
    

    【讨论】:

    • 我希望可以向 syslog_message 添加第二个过滤器,以这种方式添加其他过滤器(例如 log4j),但无论如何,工作正常
    • 在您的模式中,syslog_message 只匹配最后的内容,即 apache 日志信息。正如我所提到的,您可以使用单独的 grok 解析该新字段(我喜欢先剥离常见的东西),或者通过将 apache 内容放在原始 grok 的末尾来跳过新字段的创建。希望这更清楚?
    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多