【问题标题】:Fluentd Multiple regex named CapturesFluentd 多个名为 Captures 的正则表达式
【发布时间】:2015-07-29 19:33:46
【问题描述】:

我们可以连接多个命名捕获的正则表达式吗?

我正在尝试在 fluentd conf 文件中使用以下正则表达式来获取“用户”和“序列号”,但只能获取名字(用户)。

td-agent.conf:

<source>
   type tail
   format /(?<User>(?<=user:).*?(?=\]))(?<Serial_Number>(?<=sn:).*?(?=\]))/
   tag xxxxxx
   path /app/logs/xxxx.log
   pos_file /var/log/td-agent/xxxx_rolling.pos
</source>

日志文件:

Jul24,11:20:17 TID:6 INFO [user:weblogic] [sn:088039] [dur:806ms] {***message}

我是 fluentD 中这种正则表达式格式的新手,希望能在这个问题上提供任何帮助。

-普雷文

【问题讨论】:

    标签: regex fluentd


    【解决方案1】:

    在这种情况下不需要“连接”,您只需要在第一个捕获组和第二个捕获组之间允许一些任意数量的任意字符。

    你最好使用否定字符类,你需要让用户和sn之间的任何字符:

    /(?<User>(?<=user:)[^]]*)\].*?(?<Serial_Number>(?<=sn:)[^]]*)?\]/
                       ^^^^  ^^^^^                         ^^^^  ^^
    

    demo

    [^]]* 否定字符类将匹配除 ] 之外的 0 个或多个字符,.* 将匹配除换行符之外的 0 个或多个字符。

    如果你需要以任意顺序匹配潜台词,你也可以使用

    /^(?=.*(?:(?<User>(?<=user:)[^]]*)))(?=(?:.*(?<Serial_Number>(?<=sn:)[^]]*))?)/
    

    the second demo

    【讨论】:

    • 感谢您的回复!我想用这些标签只捕获“weblogic”和“088039”这个词。我试图捕获名称的原因是我的日志可能不是特定格式。如果出现任何错误消息,它可以在用户和 sn 之间有错误代码。
    • 如果中间可能有换行符,您可以使用[\s\S]*? 而不是.*?。有用吗?
    • 请在此处查看我的更新和demo
    • 感谢它适用于按该顺序排列的行,但它无法匹配另一行上的任何内容。我们可以为下面的两行提供一个通用的正则表达式吗? 2015-07-27 14:39:23,720 TID:4 错误 o.p.e.r.a.t.i.o.n.s-102 - [user:weblogic] [dur:1ms] [code:507] 无效值:地址应该是有效格式(xx:xx:)- { *****消息} 2015-07-27 14:39:23,720 TID:6 信息 o.p.e.r.a.t.i.o.n.s-83 - [user:weblogic] [sn:088039] [type:xxx] [dest:xxxxxxxx] [rpc:xxxxxx] [dur:806ms] {******************消息}
    • 我希望它现在可以工作,我将 sn 部分设为可选。
    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多