我正在使用Grok&amp; Logstash将访问日志从Nginx发送到Elastic搜索。我给Logstash所有的访问日志(使用通配符,效果很好),我想获取文件名(它的某些部分,确切地说是)并将其用作字段。< / p>
我的配置如下:
input {
file {
path => "/var/log/nginx/*.access.log"
type => "nginx_access"
}
}
filter {
if [type] == "nginx_access" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:app}.access.log" }
add_field => { "app" => "%{app}" }
}
}
}
output{
# whatever
}
但它似乎不起作用:app
字段已添加,但其值为%{app}
(未替换)。
我尝试过不同的东西,但无济于事。我可能会遗漏一些东西...... 有什么想法吗?
非常感谢
答案 0 :(得分:14)
好的,找到了。默认情况下,grok
会在匹配时中断。所以第一场比赛很好,它会跳过第二场比赛。
我解决了这个问题:
filter {
if [type] == "nginx_access" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:app}.access.log" }
break_on_match => false
}
}
}
答案 1 :(得分:1)
如果日志文件中存在不匹配的行,我发现使用2个grok块更为可取。
filter {
if [type] == "nginx_access" {
grok {
match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:app}.access.log" }
}
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
}