我已经在 windows-11 系统中设置了一个 IIS 服务器,并部署了一个示例 node.js 应用程序。我的系统上还运行着 nxLog-ce。我正在尝试读取、解析 IIS 日志并将其发送到连接到我的 Windows 系统的远程 rsyslog 服务器。因此,在我的 nxLog 配置中,我正在使用正则表达式读取 IIS 服务器日志文件。配置如下:
#sending iis server logs
<Input iis>
Module im_file
File "C:\inetpub\logs\LogFiles\W3SVC1\u_ex231010.log"
SavePos False
InputType LineBased
ReadFromLast False
<Exec>
if $raw_event =~ /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) ([^ ]+) ([^ ]+) ([^ ]+) (\d+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)/ {
$second=$1;
$third=$2;
$fourth=$3;
$fifth=$4;
$sixth=$5;
$seventh=$6;
}
</Exec>
</Input>
iis服务器日志样本如下:
2023-10-10 04:53:12 ::1 GET /node - 80 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/117.0.0.0+Safari/537.36 - 404 0 2 371
rsyslog 中收到的日志中没有一个键(方法、UriStem 等):
Oct 10 12:59:27 10.228.13.4 {"EventReceivedTime":"2023-10-10 12:59:28","SourceModuleName":"iis","SourceModuleType":"im_file"}#015
我认为 if 条件(在配置中给出)不起作用,因为正则表达式是错误的。
我尝试过以下正则表达式:
20[0-9][0-9]-[01][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9] .* [a-zA-Z]* .* - [0-9][0-9]+ - .* [a-zA-Z0-9\.\-\ ]+\/[0-9\.\-a-zA-Z\+]*.* - [0-9][0-9]+ [0-9]+ [0-9]+ [0-9]+
使用此正则表达式,我可以在 rsyslog 服务器中收到的日志中找到密钥,但收到的每个自定义密钥的值为空:
Oct 10 12:59:27 10.228.13.4 {"EventReceivedTime":"2023-10-10 12:59:28","SourceModuleName":"iis","SourceModuleType":"im_file","second":null,"third":
null,"fourth":null,"fifth":null,"sixth":null,"seventh":null}#015
有人可以建议我应该在 nxLog-ce 配置中放入什么正则表达式,以便我可以获得带有值的键。或者我在这里做错了什么,任何建议都会有帮助。
您提供的iis服务器日志样本中有15个标准字段,我认为您可能需要增加正则表达式中捕获组的数量。请尝试下面的正则表达式:
<Exec>
if $raw_event =~ /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)/
{
$second=$1;
$third=$2;
$fourth=$3;
$fifth=$4;
$sixth=$5;
$seventh=$6;
}
</Exec>