You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在正则表达式中匹配可选组?适配Fluentd解析Nginx错误日志

适配含可选upstream字段的Nginx错误日志Fluentd正则表达式

修正后的正则表达式

format1 /^(?<time>\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<pid>\d+)#(?<tid>\d+): (?<error>.*?)(?=, client:), client: (?<client>.*?), server: (?<server>.*?), request: (?<request>.*?)(?:, upstream: (?<upstream>.*?))?, host: (?<host>.*?), referrer: (?<referrer>.*)$/

关键修改说明

  • 解决贪婪匹配问题:将原正则中(?<error>.*)改为(?<error>.*?)(?=, client:),用非贪婪匹配.*?配合正向预查(?=, client:),确保错误描述精准停在, client:前,不会吃掉后续字段内容。
  • 添加可选upstream匹配:在request和host字段之间加入(?:, upstream: (?<upstream>.*?))?,其中(?:...)是非捕获组,末尾的?表示该组可出现0次或1次,完美兼容有无upstream字段的日志行。
  • 字段值精准匹配:所有字段值的匹配都改用非贪婪的.*?,避免因贪婪匹配导致的字段串位问题。
  • 精确匹配pid与tid分隔符:将原正则中匹配pid和tid之间的任意字符.改为实际的#,提升匹配精度。

验证说明

  • 对于无upstream的日志行,upstream字段会被忽略(Fluentd中不会生成该字段或赋值为null)。
  • 对于含upstream的日志行,upstream字段会被正确提取对应值。

内容的提问来源于stack exchange,提问作者Saeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:13:20