使用logstash如何组合以时间戳开头的行

使用logstash如何组合以时间戳开头的行,logstash,multiline,logstash-grok,Logstash,Multiline,Logstash Grok,下面是我需要使用logstash解析的示例日志文件: 2016-12-27 07:54:38.621 8407 ERROR oslo_service.service Traceback (most recent call last): 2016-12-27 07:54:38.621 8407 ERROR oslo_service.service File "/usr/lib/python2.7/dist-packages/oslo_service/service.py", line 680,

下面是我需要使用logstash解析的示例日志文件:

2016-12-27 07:54:38.621 8407 ERROR oslo_service.service Traceback (most recent call last):
2016-12-27 07:54:38.621 8407 ERROR oslo_service.service   File "/usr/lib/python2.7/dist-packages/oslo_service/service.py", line 680, in run_service
2016-12-27 07:54:38.621 8407 ERROR oslo_service.service     service.start()
2016-12-27 07:54:38.621 8407 ERROR oslo_service.service   File "/usr/lib/python2.7/dist-packages/nova/service.py", line 428, in start
2016-12-27 07:54:38.621 8407 ERROR oslo_service.service     self.binary)
2016-12-27 07:54:38.621 8407 ERROR oslo_service.service   File "/usr/lib/python2.7/dist-packages/oslo_versionedobjects/base.py", line 181, in wrapper
请给我一些建议,我如何使用grok multiline filter解析这种格式的日志,以及我应该使用什么模式


提前谢谢你

如果您使用
grok
multiline
尝试这样的操作会怎么样:

input {
 file {
    path => [""] <-- path to your log directory
    start_position => "beginning"
    codec => multiline {
                   pattern => "^%{TIMESTAMP_ISO8601}"
                   negate => true
                   what => previous
    }       
  }
}
filter {
     grok {
        patterns_dir => "./patterns" <-- the path to the patterns file
        match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{WORD:level} %{GREEDYDATA:content}"]
     }
}
输入{
文件{
路径=>[“”]开始
编解码器=>多行{
模式=>“^%{TIMESTAMP_ISO8601}”
否定=>true
什么=>以前的
}       
}
}
滤器{
格罗克{
patterns_dir=>“/patterns”[“message”,“%{TIMESTAMP_ISO8601:TIMESTAMP}%{WORD:level}%{greedydydata:content}”]
}
}
以上只是一个样本,你可以随意复制

Multiline
是用于读取数据的模式,将以空格开头的所有行附加到前一行。换句话说,当Logstash读取以空格(空格、制表符)开头的输入行时,该行将与先前读取的输入信息合并


这可能也有帮助。希望有帮助

有两种方法可以实现

  • 日志存储输入中的多行
这可以使用多线程来解析日志

input {
     beats {
        port => 5044
        codec => multiline {
        pattern => "^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[\.,][0-9]{3,7} "
        negate => true
        what => "previous"
        }
        congestion_threshold  => 40
       }
    }
  • 对数滤波器中的多重线性
不能使用多线程,但可以根据特殊情况设置过滤器

 filter {
        if  [@metadata][beat] =~ "xxxx"   {
              multiline {
               pattern => "^%{TIMESTAMP_ISO8601}"
               negate => true
               what => "previous"
            }
      }
    }