求nxLog-ce配置中解析IIS服务器日志的正确正则表达式
IIS日志解析与nxLog-ce配置修复
问题概述
在Windows 11环境下,使用nxLog-ce读取IIS日志并发送至远程rsyslog服务器时,出现以下问题:
- 初始正则匹配失败,导致rsyslog接收的日志中无
Method、UriStem等自定义字段 - 更换正则后,rsyslog能识别字段,但所有字段值均为
null
问题原因
- 初始正则缺陷:使用
[^ ]+匹配所有字段,但IIS日志中的UserAgent字段包含转义空格(+),[^ ]+会在第一个实际空格处停止匹配,导致整个正则表达式匹配失败,if条件不生效,无法生成自定义字段。 - 第二次正则缺陷:未正确设置捕获组,虽然正则能匹配日志行,但没有捕获到对应字段的值,因此映射后字段为
null。
正确配置方案
以下是适配IIS W3C日志格式的nxLog-ce Input配置,包含正确的正则表达式和字段映射:
#sending iis server logs <Input iis> Module im_file File "C:\inetpub\logs\LogFiles\W3SVC1\u_ex*.log" # 通配符匹配所有日期的日志文件 SavePos True # 记录读取位置,避免重复读取 InputType LineBased ReadFromLast False <Exec> # 匹配IIS标准W3C日志字段,针对UserAgent的特殊格式做适配 if $raw_event =~ /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (.+?) (\S+) (\S+) (\S+) (\S+) (\S+)/ { $EventTime = parsedate($1); # 转换为nxLog标准时间字段 $ClientIP = $2; # 客户端IP $Method = $3; # 请求方法(GET/POST等) $UriStem = $4; # 请求URI路径 $UriQuery = $5; # 查询字符串 $ServerPort = $6; # 服务器端口 $UserName = $7; # 用户名 $ClientIP2 = $8; # 客户端IP(备用字段) $UserAgent = $9; # 用户代理(适配转义空格格式) $Referer = $10; # 引用页 $Status = $11; # HTTP状态码 $SubStatus = $12; # HTTP子状态码 $Win32Status = $13; # Win32状态码 $TimeTaken = $14; # 请求响应时间 delete($raw_event); # 移除原始事件,减少日志体积 } </Exec> </Input>
关键说明
- 正则适配:使用
(.+?)匹配UserAgent字段,该模式会匹配到下一个空格分隔的字段(即Referer前的-),兼容包含+转义空格的UserAgent内容。 - 字段命名:将捕获组映射为语义化的字段名,便于rsyslog端识别和处理。
- 日志文件匹配:用
u_ex*.log通配符替代单个日期的日志文件,自动读取所有新生成的IIS日志。 - 读取优化:设置
SavePos True,nxLog会记录已读取的日志位置,避免服务重启后重复发送历史日志。
额外注意事项
- 确认IIS日志的字段顺序与示例一致,若IIS配置了不同的日志字段,需对应调整正则的捕获组顺序。
- 可通过
nxlog -v命令启动服务,查看调试日志,验证正则匹配是否正常。 - 确保nxLog服务账号拥有IIS日志目录的读取权限,否则会出现日志读取失败的情况。
- rsyslog端需配置JSON解析模板,才能正确提取nxLog发送的自定义字段。
内容的提问来源于stack exchange,提问作者Ankur Gangwar
相关产品推荐
相关产品推荐

