【发布时间】: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