1

定義されたslf4jXML形式を使用して書き込まれているログファイルがあります。スクリプトを記述し、XML形式のファイルをフィードして、そこに含まれるメッセージを解析する方法はありますか?

出力例:

2012-10-11 16:53:25.895 [main] {} INFO  org.mortbay.log - jetty-6.1.11
2012-10-11 16:53:26.097 [main] {} INFO  / - Initializing Spring root WebApplicationContext

XMLの定義に基づいて列で区切る出力ファイル(csvなど)を作成したいと思います。

<encoder>
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] {%mdc} %-5level %logger{36} - %msg%n</pattern>
</encoder>

ヘルプ/ポインタをいただければ幸いです。

ありがとうございました!

4

2 に答える 2

2

もちろん、PerlでXMLファイルを読み取る方法はたくさんあります。XML::ParserXML::LibXMLなどです。

XML::Parserから始めます。XML :: LibXMLは長期的には優れているように見えますが、XML::Parserの方がはるかに快適だと感じています。

編集:あなたがあなたの質問を編集したので、私は私の応答が適切ではないことがわかります。明らかに、パターン(上記のXMLモジュールまたは単純な正規表現が必要になる可能性があります)を取得することは問題にはなりません。残念ながら、パターンの可能なフォーマットオプションはわかりません。複雑なようです。

各行に適用できるパターンに基づいて正規表現を作成します。

この特定のケースでは、正規表現は次のようになります。

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}:\d{2}.\d{3})\s\[(.*?)\]\s\{(.*?)\}\s(.*?*) - (.*)(\d*)

私はPerlを知っていますが、メッセージ形式を知らないので、推測することしかできません。slf4jのフォーマットアトムはパターンに従うと思います。%-?\w+(\{.*?\}|)つまり、パーセント記号、オプションのマイナス、英数字、そしてオプションで中括弧内のいくつかの追加のフォーマットオプションです。

XMLフォーマット命令を解析し、パターンを変数に正常に抽出できたと$patternすると、次のようになります。

$pattern =~ s/%-?\w+(\{.*?\}|)/(.*?)/g

サンプルパターンに適用すると、次の正規表現が生成されます。

(.*?) [(.*?)] {(.*?)} (.*?) (.*?) - (.*?)(.*?)

ログファイルのすべての行と照合できます。

@parsed = ( $line =~ /$pattern/ )

これはまだ完全ではなく、失敗します。日付形式を認識し、%nと%msgを区別する必要があります(%nには数字しか含めることができないと思いますが、そうでない場合は問題があります)。ただし、これがどこに向かっているのかがわかります。お役に立てば幸いです。

于 2012-10-12T08:18:11.287 に答える
0

私はあなたの質問を理解するかどうかはよくわかりませんが、Perl用Log::Log4perlLog4j実装があります

Log4jの設定ファイルが使えると思います

于 2012-10-12T08:28:00.020 に答える