我有一个包含复杂消息类型的日志文件。这是一个例子:
2016-07-07 13:30:02 [Main] *** Program start ***
2016-07-07 13:30:02 [UnzipFile] Before file collection
2016-07-07 13:30:02 [GetZipCol] Start get sorted zip file collection
2016-07-07 13:30:02 [GetZipCol] End get sorted zip file collection
2016-07-07 13:30:02 [Main] [ERROR] No unzip file
2016-07-07 13:30:03 [Main] *** Program end ***
以下grok模式仅适用于前4行但不适用于第5行。
grok{
match => {"message" => ['%{Date:Date}%{SPACE}%{Time:Time}%{SPACE}%{WORD:Job}%{SPACE}%{GREEDYDATA:Message}']}
}
我想知道如何修改grok模式以捕获上一条消息中的[ERROR]
。有没有人知道如何做到这一点?
这是我在conf
中的输出部分if [Message] == "*** Program start ***" {
elasticsearch {
hosts => ["localhost:9200"]
index => "log-%{+YYYY.MM.dd}"
template => "C:/logstash/log.json"
template_overwrite => true
}
}
if [Message] == "*** Program end ***" {
elasticsearch {
hosts => ["localhost:9200"]
index => "log-%{+YYYY.MM.dd}"
template => "C:/logstash/log.json"
template_overwrite => true
}
}
if [Level] =~ /.+/ {
elasticsearch {
hosts => ["localhost:9200"]
index => "log-%{+YYYY.MM.dd}"
template => "C:/logstash/log.json"
template_overwrite => true
}
}
如果我只想在程序开始和结束时掌握事件,并且在其他事件可以被删除时也有错误的事件。但是,根据我所写的内容。我只能用[错误]来掌握数据。我该如何掌握其他数据?并且有一种更简单的方法可以做到这一点而不是在条件语句中输入3吗?感谢。
感谢。
答案 0 :(得分:1)
您可以在同一个grok过滤器中使用两个模式,如果第一个模式失败,则第二个模式使用。因此,在您的情况下,第一个模式将尝试捕获[ERROR]
,第二个模式将是您的答案中的模式。
我认为它更具可读性。
grok{
match => {
"message" => [
'%{DATE:Date}%{SPACE}%{TIME:Time}%{SPACE}\[%{WORD:Job}\]%{SPACE}\[%{WORD:Level}\]%{SPACE}%{GREEDYDATA:Message}',
'%{DATE:Date}%{SPACE}%{TIME:Time}%{SPACE}\[%{WORD:Job}\]%{SPACE}%{GREEDYDATA:Message}'
]}
}
答案 1 :(得分:0)
我不是logstash的专家,但是从文档的快速浏览看来,这些“grok”模式似乎是普通正则表达式之上的抽象。
因此,为ERROR级别消息添加可选的非捕获组可能会起作用。即(?:\[%{WORD:Level}\]%{SPACE})?
。这样就可以读出整行:
grok{
match => {"message" => ['%{Date:Date}%{SPACE}%{Time:Time}%{SPACE}%{WORD:Job}(?:\[%{WORD:Level}\]%{SPACE})?%{GREEDYDATA:Message}']}
}
作为参考,我使用了文档的这一部分:https://www.elastic.co/guide/en/logstash/current/config-examples.html#_processing_syslog_messages