如何在 NXLog 中使用 RegEx 模式化多行 XML
How to pattern multiline XML using RegEx in NXLog
我正在尝试使用 nxLog 解析器 to_json() 将自定义日志文件解析为 JSON,这样我就可以将它们发送到我的 ElasticSearch 实例中。我将把它们分成三个单独的字段,日期、日志类型指示器和消息。
以下是这些日志的格式。
9/10/2015 11:30:05 AM [0-1-1-Pos.xaml.cs-1607] Post button clicked
9/10/2015 11:30:17 AM [0-3-1-SecondaryPortStatus.cs-47] <TRANSACTION>
<FUNCTION_TYPE>SECONDARYPORT</FUNCTION_TYPE>
<COMMAND>STATUS</COMMAND>
<MAC_LABEL>XX</MAC_LABEL>
<MAC>xOel7QeyKoXaddiyrEeWKRI1DlF9sHzUNfZHFI/gAko=</MAC>
<COUNTER>XXX</COUNTER>
</TRANSACTION>
9/10/2015 11:30:17 AM [0-3-1-SecondaryPortStatus.cs-57] <RESPONSE>
<RESPONSE_TEXT>Operation SUCCESSFUL</RESPONSE_TEXT>
<RESULT>OK</RESULT>
<RESULT_CODE>-1</RESULT_CODE>
<TERMINATION_STATUS>SUCCESS</TERMINATION_STATUS>
<COUNTER>221</COUNTER>
<SECONDARY_DATA>12</SECONDARY_DATA>
<MACLABEL_IN_SESSION>P_061</MACLABEL_IN_SESSION>
<SESSION_DURATION>00:00:16</SESSION_DURATION>
<INVOICE_SESSION>XX</INVOICE_SESSION>
<SERIAL_NUMBER>XX</SERIAL_NUMBER>
</RESPONSE>`
我已经能够使用 PERL 正则表达式语法解析日期戳和错误选择器(括号内的所有内容),如下所示。
1. ^(\d\d|\d)/(\d\d|\d)/(\d\d\d\d)\s(\d\d|\d):(\d\d|\d):(\d\d|\d)\s(AM|PM)
2. \[(.*)\]
- 日期
- 日志类型标识符
- 这就是我想要弄清楚的信息。
但我不知道如何在选择器和新行之间拉出所有内容。所以在这种情况下,我希望我的消息是 XML 代码,直到换行符。有人对我如何检索数据有建议吗?
尝试使用多行 ReGex 执行此操作:
$ perl -0777 -ne 'print $& if !<RESPONSE>.*</RESPONSE>!s' file
将 input/output 分隔符设置为 undef
(-0777) 将在内存中删除整个文件
输出:
<RESPONSE>
<RESPONSE_TEXT>Operation SUCCESSFUL</RESPONSE_TEXT>
<RESULT>OK</RESULT>
<RESULT_CODE>-1</RESULT_CODE>
<TERMINATION_STATUS>SUCCESS</TERMINATION_STATUS>
<COUNTER>221</COUNTER>
<SECONDARY_DATA>12</SECONDARY_DATA>
<MACLABEL_IN_SESSION>P_061</MACLABEL_IN_SESSION>
<SESSION_DURATION>00:00:16</SESSION_DURATION>
<INVOICE_SESSION>XX</INVOICE_SESSION>
<SERIAL_NUMBER>XX</SERIAL_NUMBER>
</RESPONSE>
在脚本中:
BEGIN { $/ = undef; $\ = undef; } # input/output separator as undef
while (defined($_ = <ARGV>)) {
print $& if m[<RESPONSE>.*</RESPONSE>]s;
}
来自 perldoc perlre
修饰符 's'
s Treat string as single line. That is, change "." to match any
character whatsoever, even a newline, which normally it would not
match.
您应该能够使用 nxlog 的 xm_multiline 模块并在 HeaderLine 指令中指定正则表达式。
如果您向正则表达式添加捕获规则以匹配 XML 部分([..] 之后的内容),那么您应该能够解析 XML用 xm_xml 的 parse_xml().
有一个类似的例子here。
我正在尝试使用 nxLog 解析器 to_json() 将自定义日志文件解析为 JSON,这样我就可以将它们发送到我的 ElasticSearch 实例中。我将把它们分成三个单独的字段,日期、日志类型指示器和消息。
以下是这些日志的格式。
9/10/2015 11:30:05 AM [0-1-1-Pos.xaml.cs-1607] Post button clicked
9/10/2015 11:30:17 AM [0-3-1-SecondaryPortStatus.cs-47] <TRANSACTION>
<FUNCTION_TYPE>SECONDARYPORT</FUNCTION_TYPE>
<COMMAND>STATUS</COMMAND>
<MAC_LABEL>XX</MAC_LABEL>
<MAC>xOel7QeyKoXaddiyrEeWKRI1DlF9sHzUNfZHFI/gAko=</MAC>
<COUNTER>XXX</COUNTER>
</TRANSACTION>
9/10/2015 11:30:17 AM [0-3-1-SecondaryPortStatus.cs-57] <RESPONSE>
<RESPONSE_TEXT>Operation SUCCESSFUL</RESPONSE_TEXT>
<RESULT>OK</RESULT>
<RESULT_CODE>-1</RESULT_CODE>
<TERMINATION_STATUS>SUCCESS</TERMINATION_STATUS>
<COUNTER>221</COUNTER>
<SECONDARY_DATA>12</SECONDARY_DATA>
<MACLABEL_IN_SESSION>P_061</MACLABEL_IN_SESSION>
<SESSION_DURATION>00:00:16</SESSION_DURATION>
<INVOICE_SESSION>XX</INVOICE_SESSION>
<SERIAL_NUMBER>XX</SERIAL_NUMBER>
</RESPONSE>`
我已经能够使用 PERL 正则表达式语法解析日期戳和错误选择器(括号内的所有内容),如下所示。
1. ^(\d\d|\d)/(\d\d|\d)/(\d\d\d\d)\s(\d\d|\d):(\d\d|\d):(\d\d|\d)\s(AM|PM)
2. \[(.*)\]
- 日期
- 日志类型标识符
- 这就是我想要弄清楚的信息。
但我不知道如何在选择器和新行之间拉出所有内容。所以在这种情况下,我希望我的消息是 XML 代码,直到换行符。有人对我如何检索数据有建议吗?
尝试使用多行 ReGex 执行此操作:
$ perl -0777 -ne 'print $& if !<RESPONSE>.*</RESPONSE>!s' file
将 input/output 分隔符设置为 undef
(-0777) 将在内存中删除整个文件
输出:
<RESPONSE>
<RESPONSE_TEXT>Operation SUCCESSFUL</RESPONSE_TEXT>
<RESULT>OK</RESULT>
<RESULT_CODE>-1</RESULT_CODE>
<TERMINATION_STATUS>SUCCESS</TERMINATION_STATUS>
<COUNTER>221</COUNTER>
<SECONDARY_DATA>12</SECONDARY_DATA>
<MACLABEL_IN_SESSION>P_061</MACLABEL_IN_SESSION>
<SESSION_DURATION>00:00:16</SESSION_DURATION>
<INVOICE_SESSION>XX</INVOICE_SESSION>
<SERIAL_NUMBER>XX</SERIAL_NUMBER>
</RESPONSE>
在脚本中:
BEGIN { $/ = undef; $\ = undef; } # input/output separator as undef
while (defined($_ = <ARGV>)) {
print $& if m[<RESPONSE>.*</RESPONSE>]s;
}
来自 perldoc perlre
修饰符 's'
s Treat string as single line. That is, change "." to match any
character whatsoever, even a newline, which normally it would not
match.
您应该能够使用 nxlog 的 xm_multiline 模块并在 HeaderLine 指令中指定正则表达式。 如果您向正则表达式添加捕获规则以匹配 XML 部分([..] 之后的内容),那么您应该能够解析 XML用 xm_xml 的 parse_xml().
有一个类似的例子here。