- ベストアンサー
Javaでlog4jを使ってログ出力する際のエラー処理について
- Javaでlog4jを使ってログ出力を行っていますが、ファイルにアクセスできずエラーが発生する場合の処理方法について説明します。
- 環境はj2sdk1.4.2とlog4j1.2.8です。
- ログファイルにアクセスできない場合、例外をcatchして処理を終了することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
FileAppender#activateOptionsの中で、 ログ出力先ファイルtest.logをopenするときにIOExceptionが発生しても、 errorログを出力するだけで、呼び出し元に例外を伝搬しないため、 処理が停止せず、そのまま続行してしまうという動きになるようです。 なので、この部分を書き換えたMyFileAppenderを定義して、 設定ファイルlog4j.xml内のFileAppenderの代わりに設定してあげれば、 「書き込めなかった場合に例外をcatchする」ことは出来るようです。 無理やりですが。。 ■MyFileAppender.java import org.apache.log4j.FileAppender; import org.apache.log4j.helpers.LogLog; public class MyFileAppender extends FileAppender { public void activateOptions() { if(fileName != null) { try { setFile(fileName, fileAppend, bufferedIO, bufferSize); } catch(java.io.IOException e) { // errorメッセージを表示せず、Errorをスローするよう変更。 // errorHandler.error("setFile("+fileName+","+fileAppend+") call failed.", // e, ErrorCode.FILE_OPEN_FAILURE); throw new MyFileAppenderInitializeError(e); } } else { //LogLog.error("File option not set for appender ["+name+"]."); LogLog.warn("File option not set for appender ["+name+"]."); LogLog.warn("Are you using FileAppender instead of ConsoleAppender?"); } } } ■MyFileAppenderInitializeError.java public class MyFileAppenderInitializeError extends Error { public MyFileAppenderInitializeError(Throwable cause) { super(cause); } } ■log4j.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <appender name="A1" class="MyFileAppender"> <param name="File" value="sample.log" /> <layout class="org.apache.log4j.SimpleLayout"/> </appender> <root> <priority value="DEBUG"></priority> <appender-ref ref="A1" /> </root> </log4j:configuration> ■呼び元クラス import org.apache.log4j.Logger; public class Log4jFileAppenderErrorTest { public static void main(String[] args) { try { Logger logger = Logger.getLogger(Log4jFileAppenderErrorTest.class); System.out.println("Hello, Java World!"); } catch(MyFileAppenderInitializeError e) { System.out.println("catch erro
その他の回答 (1)
- askaaska
- ベストアンサー率35% (1455/4149)
質問はエラーへの対処じゃないのね。 やり方としてはオリジナルのLoggerを作成することね。 その内部で例外処理を記述すればいいわ。
お礼
ご回答ありがとうございます。 エラーが発生すること自体はOKなので、Loggerを作成してみます。
お礼
ご回答ありがとうございます。 サンプルの記述もありがとうございます。 エラークラスは自作していたので、Appenderクラスを参考にさせて頂きました。