2016-11-24 10 views
1

私の英語のための恩赦。Log4j同期私はlog4jを捕まえることができません:ERROR setFile(null、true)呼び出しが失敗しました。

ログ情報を「監査」ファイルに送信します。私は排他的なアペンダとのlog4jを使用する方法について考えた:

LOGGER_AUDIT.info("Text of audit"); 

私はそれが同期書かれていることを確認したいです。次のような例外が発生した場合:

og4j:ERROR setFile(null,true) call failed. 
java.io.FileNotFoundException: D:audit.log (Access denied) 
... 

私はそれをキャプチャして実行を停止します。

それはこのようなものになるだろう:

try { 
    LOGGER_AUDIT.info("Text of audit"); 
} catch(LoggerException logExc) { 
    // TODO Ops... the logger do not write. 
    throw logExc; 
} 

おかげで、すべて。

+0

あなたはより具体的になりますか?どういう意味ですか?例外はキャッチブロックで処理されますか? PS:あなたの英語はうまくいくようです。 – Matthias

+0

うーん、私は "同期的に"あなたの問題はここではないと思う。上記のメッセージが表示されたらどうなりますか?アプリがクラッシュするのですか?もちろん、有効な書き込み可能なパスを指定することで、上記のエラーを避けることができます。 Log4j(2)は、最初のログ呼び出し時に自動的に設定されます。あなたは、あなたのアプリの始めに1つを作ってtry/catchでラップすることができます。設定中に例外が発生した場合は、それをキャッチする必要があります。 – Fildor

+0

Matthias:擬似サンプルを追加するコメントを編集します:) – vakya

答えて

0

あなたは呼び出すことでlog4j構成処理を強制することができます

BasicConfigurator.resetConfiguration(); 
DOMConfigurator.configureAndWatch(log4jConfigPath); 

をあなたはErrorHandlerの機能を使用することができ、例外をキャッチします。 https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/spi/ErrorHandler.html

これは、設定することができる方法です。

<appender name="file" class="org.apache.log4j.DailyRollingFileAppender"> 
    <errorHandler class="org.apache.log4j.varia.FallbackErrorHandler"> 
     <root-ref/> 
     <appender-ref ref="console"/> 
    </errorHandler> 
    <param name="File" value="C:/temp/test.log"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%d %-5p %30.30c - %m%n"/> 
    </layout> 
</appender> 

あなたがあなた自身のErrorHandlerの代わりFallbackErrorHandlerを置くことができます。デフォルトでは、OnlyOnceErrorHandlerが使用されます。 STDERRに例外を出力します。

+0

私のカスタムErrorHandlerは、実行を停止できますか?同期ですか? – vakya

+0

@vakya、はい、それは同期的です。 btw:いつでもlog4jコードを掘り下げることができます。 –

+0

@vakya、FileAppender#activateOptions()メソッドをチェックしてください。設定で提供されているerrorHandlerを使用します。エラーハンドラに例外を投げるだけであれば、DOMConfigurator#parseAppender()メソッドで捕捉され、InterruptedExceptionまたはInterruptedIOExceptionだけがスレッドの中断につながることに注意してください。アプリケーションを単に停止したい場合は、System.exit()を呼び出して、 –

関連する問題