現在、内部ログ ファイル (log4php、log4net、および log4j によって生成される) のパーサーに取り組んでいます。これまでのところ、ログを解析するための適切な正規表現がありますが、厄介な点が 1 つあります。一部のログ メッセージは複数の行にまたがっており、適切に一致させることができません。私が今持っている正規表現はこれです:
(?<date>\d{2}/\d{2}/\d{2})\s(?<time>\d{2}):\d{2}:\d{2}),\d{3})\s(?<message>.+)
ログ形式 (パーサーのテストに使用) は次のとおりです。
07/23/08 14:17:31,321 log
message
spanning
multiple
lines
07/23/08 14:17:31,321 log message on one line
今パーサーを実行すると、ログが始まる行だけが得られます。複数行にまたがるように変更すると、1 つの結果 (ログ ファイル全体) しか得られません。
@サムジャドソン:
RegexOptions.Singleline フラグを正規表現に渡す必要があるため、「.」改行を除くすべての文字 (デフォルト) だけでなく、すべての文字に一致します。
私はそれを試しましたが、ファイル全体に一致します。また、メッセージグループを .+? に設定しようとしました。(貪欲ではない)が、それは単一の文字に一致します(これは私が探しているものでもありません)。
問題は、メッセージのパターンが日付グループにも一致することです。そのため、改行で改行されない場合、メッセージは延々と続くだけです。
現在、メッセージ グループにこの正規表現を使用しています。ログメッセージの開始と同じパターンがログメッセージにない限り、機能します。
(?<message>(.(?!\d{2}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2},\d{3}\s\[\d{4}\]))+)