【发布时间】:2018-04-11 10:17:09
【问题描述】:
我正在尝试使用一些正则表达式解析应用程序日志。我能够解析时间戳。但在那之后,如果我尝试向 fluentd 格式添加更多表达式,第一个属性“时间”就会消失,并给我一个例外。并且没有匹配的记录。
我正在使用 Fluentular。
日志消息将类似于:
Date=[2018-04-11 08:44:30,219] Thread=[20] Level=[INFO] EventId=[2] Message=[Request finished in 1.1825ms 200 text/plain; charset=utf-8]
这是第一个带有第一个键的正则表达式(毫秒有问题,但不重要)。在属性中,我可以看到具有此值的关键时间。
然后,如果我尝试隔离日志中的更多信息,我会丢失第一个密钥,并且无法解析任何其他数据。
我做错了什么?
谢谢
更新:
基于 cmets 现在我有了这个表达式
(?<time>\[(?<time>[^\]\[]+)])\s+(?<Thread>\S+)\s+(?<Level>\S+)\s+(?<EventId>\S+)\s+(?<Message>[^ ].*$)
几乎完美。唯一的问题是,表达式也得到了方括号
关键线程 值线程=[20]
不知道这个表达式是否可以改进以避免
“线程=[]”
更新 2:
为了进行测试,我通过 apt 插件安装了 fluentd 并进行了一些测试,我的最终设置类似于
<parse>
@type kv
time_key Date
types Date:time:%Y-%m-%d %H:%M:%S,Thread:integer,Level:string,EventId:integer,Message:string
kv_delimiter /\]\s+/
kv_char "=["
现在看起来好多了:
2018-04-11 08:44:30.219000000 +0200 kv_log: {"Thread":20,"Level":"INFO","EventId":2,"Message":"Request finished in 1.1825ms 200 text/plain; charset=utf-8]"}
【问题讨论】:
-
第二个正则表达式的期望是什么?
-
您应该将环视转换为消费模式,依赖于捕获。例如。
\[(?<time>[^\]\[]+)]\s+(?<method>\S+)。您的模式不起作用,因为(?=\])不使用]并且您必须将它放在捕获组之后。你在这里的最终目标是什么? -
基本上就是解析日志的不同记录,得到Date、Thread、Level、EventID最后是Message的数据。所以 Splunk 会得到所有在不同记录或属性中解析的数据。