簡體   English   中英

如何在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 regex語法解析日期戳和錯誤選擇器(括號內的所有內容),如下所示。

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. \[(.*)\] 
  1. 日期
  2. 日志類型標識符
  3. 我要設法找出的信息。

但是我不知道如何在選擇器和新行之間提取所有內容。 因此,在這種情況下,我希望消息是直到換行符為止的XML代碼。 有人對我如何檢索數據有建議嗎?

您應該能夠使用nxlog的xm_multiline模塊並在HeaderLine指令中指定regexp。 如果將捕獲規則添加到正則表達式以匹配XML部分(在[..]之后 ),則應該能夠使用xm_xml的parse_xml()解析XML。

還有一個類似的例子在這里

嘗試使用多行ReGex執行此操作:

$ perl -0777 -ne 'print $& if !<RESPONSE>.*</RESPONSE>!s' file

將輸入/輸出分隔符設置為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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM