用logstash的grok插件,匹配下面格式的log
2018-04-17 23:42:10.335 INFO [main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
用表達式
%{DATA:day} %{DATA:time} %{DATA:level} \[%{DATA:thread}\] %{DATA:className} \: %{GREEDYDATA:msg}
匹配出來的結果是
{
"day": [
[
"2018-04-17"
]
],
"time": [
[
"23:42:10.335"
]
],
"level": [
[
" INFO 7304 ---"
]
],
"thread": [
[
"main"
]
],
"className": [
[
"s.b.c.e.t.TomcatEmbeddedServletContainer"
]
],
"msg": [
[
"Tomcat initialized with port(s): 8080"
]
]
}
可以看到時間被分成了兩個字段,官方的表達式沒有匹配中國時間的,於是我想到能不能自定義正則表達式,后來終於找到了。下面是我改進的表達式:
(?\S{10} \S{12}) %{DATA:level} \[%{DATA:thread}\] %{DATA:className} \: %{GREEDYDATA:msg}
結果時間字段完美解析了:
{
"fullTime": [
[
"2018-04-17 23:42:10.335"
]
],
"level": [
[
" INFO"
]
],
"thread": [
[
"main"
]
],
"className": [
[
"s.b.c.e.t.TomcatEmbeddedServletContainer"
]
],
"msg": [
[
"Tomcat initialized with port(s): 8080"
]
]
}