Logstash rsyslog + 阿帕奇

Logstash rsyslog + apache

我想使用 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 匹配命令,或者我可以分两步执行此操作:提取系统日志数据,并使用 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}" }
   }
  }
}

你非常接近!

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

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

由于日志文件只有一种格式,您也可以将两个 groks 合二为一:

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