0

Log4jLogFilePatternReceiverクラスを使用して単純なログ ファイルを読み取っていますが、Log4j にフォーマット修飾子をオプションとして解釈するように指示する方法があるかどうか疑問に思っていました。

たとえば、次のパターンを想定します。

%r [%t] %p %c %x - %m%n

これは文字列に一致します

123 [main] INFO org.apache.log4j.whatever x=8 - Just a message.

しかし、文字列ではありません

123 [main] INFO org.apache.log4j.whatever - Just a message.

(つまり、上記と同じですが、「x=8」の部分はありません)。

Log4jに両方を一致させる方法はありますか?

別の関連するメモとして、 のソース コードにいくつかの追加の print ステートメントを LogFilePatternReceiver入れると、次のようになります。

Pattern: {%r [%t] %p %c %x - %m%n}
Regex:   {(.*?)[ ]+\[(.*?)\][ ]+(\S*\s*?)[ ]+(\S*\s*?)[ ]+(.*)[ ]+\-[ ]+(.*?)}

ここで、中括弧は、余分なスペースやその他の文字が含まれていないことを確認するために、各式に属さずに単に各式の開始/終了を示します。正規表現は、メソッドLogFilePatternReceiverの最後で ,によって作成されます。initialize()

regexpal.comで正規表現を試してみると、メッセージを除く部分のみ一致します。つまり、正規表現によると、一致は次のとおりです。

123 [main] INFO org.apache.log4j.whatever x=8 - 

(最後にスペースを入れて)。メッセージを含めるには、正規表現を $ 記号で閉じる必要があるようです。

パターン定義に誤りがありますか?

4

2 に答える 2

0

最後の括弧は怠惰な数量詞を囲みます:.*?「0個以上の文字に一致し、可能な限り少なくする」ことを意味します。これは、空の文字列が有効な一致であることを意味します(これは、正規表現の他の部分で意味があります。これは、正規表現の前の部分に飲み込まれたくないものが続くためです)。

.*代わりに、「できるだけ多くの0個以上の文字に一致する」という意味の使用:

(.*?) +\[(.*?)\] +(\S*\s*?) +(\S*\s*?) +(.*) +- +(.*)
于 2011-07-09T10:06:30.653 に答える
0

LogFilePatternReceiver にこの LogFormat を試してください (* ワイルドカードに注意してください)

PROP(RELATIVETIME) [スレッド] LEVEL LOGGER*PROP(X) - メッセージ

于 2011-07-10T06:35:30.997 に答える