我一直在尝试使用logstash解析python回溯日志。我的日志如下:
[pid: 26422|app: 0|req: 73/73] 192.168.1.1 () {34 vars in 592 bytes} [Wed Feb 18 13:35:55 2015] GET /data => generated 2538923 bytes in 4078 msecs (HTTP/1.1 200) 2 headers in 85 bytes (1 switches on core 0)
Traceback (most recent call last):
File "/var/www/analytics/parser.py", line 257, in parselogfile
parselogline(basedir, lne)
File "/var/www/analytics/parser.py", line 157, in parselogline
pval = understandpost(parts[3])
File "/var/www/analytics/parser.py", line 98, in understandpost
val = json.loads(dct["events"])
File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Unterminated string starting at: line 1 column 355 (char 354)
到目前为止,除了最后一行之外,我已经能够解析日志
^{pr2}$我使用多行过滤器来实现这一点。我的logstash配置如下所示:
filter {
multiline {
pattern => "^Traceback"
what => "previous"
}
multiline {
pattern => "^ "
what => "previous"
}
grok {
match => [
"message", "\[pid\: %{NUMBER:process_id:int}\|app: 0\|req: %{NUMBER}/%{NUMBER}\] %{IPORHOST:clientip} \(\) \{%{NUMBER:vars:int} vars in %{NUMBER:bytes:int} bytes\} \[%{GREEDYDATA:timestamp}\] %{WORD:method} /%{GREEDYDATA:referrer} \=\> generated %{NUMBER:generated_bytes:int} bytes in %{NUMBER} msecs \(HTTP/%{NUMBER} %{NUMBER:status_code:int}\) %{NUMBER:headers:int} headers in %{NUMBER:header_bytes:int} bytes \(%{NUMBER:switches:int} switches on core %{NUMBER:core:int}\)%{GREEDYDATA:traceback}"
]
}
if "_grokparsefailure" in [tags] {
multiline {
pattern => "^.*$"
what => "previous"
negate => "true"
}
}
if "_grokparsefailure" in [tags] {
grok {
match => [
"message", "\[pid\: %{NUMBER:process_id:int}\|app: 0\|req: %{NUMBER}/%{NUMBER}\] %{IPORHOST:clientip} \(\) \{%{NUMBER:vars:int} vars in %{NUMBER:bytes:int} bytes\} \[%{GREEDYDATA:timestamp}\] %{WORD:method} /%{GREEDYDATA:referrer} \=\> generated %{NUMBER:generated_bytes:int} bytes in %{NUMBER} msecs \(HTTP/%{NUMBER} %{NUMBER:status_code:int}\) %{NUMBER:headers:int} headers in %{NUMBER:header_bytes:int} bytes \(%{NUMBER:switches:int} switches on core %{NUMBER:core:int}\)%{GREEDYDATA:traceback}"
]
remove_tag => ["_grokparsefailure"]
}
}
}
但我的最后一行不是解析。相反,它仍然会给我一个错误,并且会成倍地增加处理时间。关于如何解析回溯的最后一行有什么建议吗?在
好吧,我找到了解决办法。因此,我采用的方法是忽略以'['开头的日志消息的开头,所有其他行都将附加到前一条消息的末尾。然后可以应用grok过滤器并解析回溯。请注意,我必须应用两个grok过滤器:
当有GREEDYDATA的回溯时。
因为在没有回溯的情况下,GREEDYDATA解析会失败,我将不得不删除grokparsefailure标记,然后在没有GREEDYDATA的情况下再次应用grok。这是在if块的帮助下完成的。
最后的logstash过滤器如下所示:
或者,如果您不想使用if块检查另一个grok模式并删除
^{pr2}$_grokparsefailure
,那么可以使用第一个grok过滤器来检查这两种消息类型,方法是在grok filter的match
数组中包含多个消息模式检查。可以这样做:还有第三种方法(可能是最优雅的一种)。看起来像这样:
注意,在这个方法中,存在为可选的字段必须用“()?”括起来。这里,
(%{GREEDYDATA:traceback})?
因此,grok过滤器会看到如果字段可用,它将被解析。否则,将跳过它。在
相关问题 更多 >
编程相关推荐