【问题标题】:Regexp for parse log with fluentd使用 fluentd 解析日志的正则表达式
【发布时间】: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]

这是第一个带有第一个键的正则表达式(毫秒有问题,但不重要)。在属性中,我可以看到具有此值的关键时间。

First regexp ok

然后,如果我尝试隔离日志中的更多信息,我会丢失第一个密钥,并且无法解析任何其他数据。

Regexp with second key

我做错了什么?

谢谢

更新:

基于 cmets 现在我有了这个表达式

(?<time>\[(?<time>[^\]\[]+)])\s+(?<Thread>\S+)\s+(?<Level>\S+)\s+(?<EventId>\S+)\s+(?<Message>[^ ].*$)

Regexp 3

几乎完美。唯一的问题是,表达式也得到了方括号

关键线程 值线程=[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]"}

【问题讨论】:

  • 第二个正则表达式的期望是什么?
  • 您应该将环视转换为消费模式,依赖于捕获。例如。 \[(?&lt;time&gt;[^\]\[]+)]\s+(?&lt;method&gt;\S+)。您的模式不起作用,因为 (?=\]) 不使用 ] 并且您必须将它放在捕获组之后。你在这里的最终目标是什么?
  • 基本上就是解析日志的不同记录,得到Date、Thread、Level、EventID最后是Message的数据。所以 Splunk 会得到所有在不同记录或属性中解析的数据。

标签: regex fluentd


【解决方案1】:

我建议使用 Key-Value Pairs Parser Plugin for Fluentd 解析键值对。

参数

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多