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

自定义Apache日志正则解析:新增elapsed字段后解析异常求助

Apache日志正则解析问题:新增elapsed字段后无法正确解析后续内容

我正在解析自定义格式的Apache日志,该日志在size字段与referer字段之间新增了elapsed字段,但无法正确解析elapsed字段之后的referer和agent内容。

待解析日志行

10.1.1.1 - - [16/Nov/2022:15:34:38 +0000] "GET /server-status HTTP/1.1" 200 32 0 "-" "kube-probe/1.21"

原正则表达式

^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*) (?<elapsed>[^ ]*) (?: "(?<referer>[^\"]*)" "(?<agent>.*)")?

当前解析结果

host    10.121.17.62
user    -
time    16/Nov/2022:15:34:38 +0000
method  GET
path    /server-status
code    200
size    32057
elapsed 0
referer  
agent

期望解析结果

host    10.121.17.62
user    -
time    16/Nov/2022:15:34:38 +0000
method  GET
path    /server-status
code    200
size    32057
elapsed 0
referer -    
agent   kube-probe/1.21

解决方案

问题根源是正则中elapsed字段后的多余空格:原正则在(?<elapsed>[^ ]*)后加了一个空格,但实际日志里elapsed值(如0)后面直接跟"-",没有额外空格,导致正则无法匹配后续引号内容。

修正后的正则表达式

如果日志中一定存在referer和agent字段:

^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*) (?<elapsed>[^ ]*)"(?<referer>[^\"]*)" "(?<agent>.*)"

如果需要保留referer和agent的可选性(日志中可能缺失):

^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*) (?<elapsed>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>.*)")?

说明

将原正则中elapsed字段后的空格移到非捕获组内部的引号前,让正则正确匹配elapsed值后的"-"内容,从而正常解析出referer和agent字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:25:19