自定义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
相关产品推荐
相关产品推荐

