Hi, i have an ELK stack on docker and put logs througt "gelf", i need match logs by log format, i have two files (access.log and error.log, and one single tag "apache") i have this filter
filter {
if [tag] == "apache" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
add_field => [ "logtype", "apache-log" ]
}
grok {
match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{WORD:module}:%{LOGLEVEL:loglevel}\] \[pid %{NUMBER:pid}:tid %{NUMBER:tid}\] \[client %{IP:clientip}:.*\] %{DATA:errorcode}: %{GREEDYDATA:message}" }
add_field => [ "logtype", "apache-error" ]
}
if "_grokparsefailure" in [tags] {
drop {}
}
}
}
Only one grok works at a time, together no logs are available, if i comment first grok i have only errors if i comment second grok i have only access:
errors only:
filter {
if [tag] == "apache" {
# grok {
# match => { "message" => "%{COMBINEDAPACHELOG}" }
# add_field => [ "logtype", "apache-log" ]
# }
grok {
match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{WORD:module}:%{LOGLEVEL:loglevel}\] \[pid %{NUMBER:pid}:tid %{NUMBER:tid}\] \[client %{IP:clientip}:.*\] %{DATA:errorcode}: %{GREEDYDATA:message}" }
add_field => [ "logtype", "apache-error" ]
}
if "_grokparsefailure" in [tags] {
drop {}
}
}
}
access only:
filter {
if [tag] == "apache" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
add_field => [ "logtype", "apache-log" ]
}
# grok {
# match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{WORD:module}:%{LOGLEVEL:loglevel}\] \[pid %{NUMBER:pid}:tid %{NUMBER:tid}\] \[client %{IP:clientip}:.*\] %{DATA:errorcode}: %{GREEDYDATA:message}" }
# add_field => [ "logtype", "apache-error" ]
# }
if "_grokparsefailure" in [tags] {
drop {}
}
}
}
Is there a way to have them both?
pjanzen
(Paul Janzen)
May 17, 2017, 12:47pm
2
Sorry but I do not understand how it can help me? an example?
pjanzen
(Paul Janzen)
May 17, 2017, 12:57pm
4
stefanocog:
filter {
if [tag] == "apache" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
add_field => [ "logtype", "apache-log" ]
}
grok {
match => { "message" => "[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})] [%{WORD:module}:%{LOGLEVEL:loglevel}] [pid %{NUMBER:pid}:tid %{NUMBER:tid}] [client %{IP:clientip}:.*] %{DATA:errorcode}: %{GREEDYDATA:message}" }
add_field => [ "logtype", "apache-error" ]
}
if "_grokparsefailure" in [tags] {
drop {}
}
}
}
Something like this.
filter {
if [tag] == "apache" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
add_field => [ "logtype", "apache-log" ]
remove_tag => ['_grokparsefailure']
}
grok {
match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{WORD:module}:%{LOGLEVEL:loglevel}\] \[pid %{NUMBER:pid}:tid %{NUMBER:tid}\] \[client %{IP:clientip}:.*\] %{DATA:errorcode}: %{GREEDYDATA:message}" }
add_field => [ "logtype", "apache-error" ]
remove_tag => ['_grokparsefailure']
}
if "_grokparsefailure" in [tags] {
drop {}
}
}
}
In this way i have only error log...
pjanzen
(Paul Janzen)
May 17, 2017, 1:13pm
6
Then COMBINEDAPACHELOG does not match.
you can test your grok patterns here
But if i comment the error.log grok, i have access logs correctly....i have already test with grokdebug and work
If i invert order of grok i have only access log, like this
filter {
if [tag] == "apache" {
grok {
match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{WORD:module}:%{LOGLEVEL:loglevel}\] \[pid %{NUMBER:pid}:tid %{NUMBER:tid}\] \[client %{IP:clientip}:.*\] %{GREEDYDATA:message}" }
add_field => [ "logtype", "apache-error" ]
remove_tag => ["_grokparsefailure"]
}
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
add_field => [ "logtype", "apache-log" ]
remove_tag => ["_grokparsefailure"]
}
if "_grokparsefailure" in [tags] {
drop {}
}
}
}
Why not set the logtype
field already on the input side? Why do you need to use grok to figure out what kind of a log it is?
if [tag] == "apache" {
Do you really have a field named tag
? Or did you mean "apache" in [tags]
?
I suggest you disable the _grokparsefailure
tag (using the tag_on_failure
option) and change
if "_grokparsefailure" in [tags] {
into
if not [logtype] {
so that you delete events that haven't had the logtype
field set, indicating that none of the grok filters matched.
But really, instead of dropping those events you should save them somewhere . How would you otherwise know if your grok filters are incorrectly failing to match some legitimate input events?
I use gelf driver for docker, i can apply only "tag" or "label" (https://docs.docker.com/engine/admin/logging/overview/#gelf ), and can't apply tag to separate input file...
i would like to install filebeat, but I have containers in alpine and I can not install it because in edge repository. I have (now) two types of file, apache access and apache errors, maybe you mean that way?
filter {
if [tag] == "apache" {
grok {
match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{WORD:module}:%{LOGLEVEL:loglevel}\] \[pid %{NUMBER:pid}:tid %{NUMBER:tid}\] \[client %{IP:clientip}:.*\] %{GREEDYDATA:message}" }
add_field => [ "logtype", "apache-error" ]
remove_tag => ["_grokparsefailure"]
}
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
add_field => [ "logtype", "apache-log" ]
remove_tag => ["_grokparsefailure"]
}
if not [logtype] {
drop {}
}
}
}
In any case the two patterns work perfectly, the problem is that one excludes the other
I have (now) two types of file, apache access and apache errors, maybe you mean that way?
Yes, that looks reasonable except that I'd use tag_on_failure
instead of remove_tag
.
In any case the two patterns work perfectly, the problem is that one excludes the other
Not sure what you mean by this.
system
(system)
Closed
June 19, 2017, 12:32pm
12
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.