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}" }
我想使用 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}" }