プロが教えるわが家の防犯対策術!

Javaでlog4jを使ってログ出力を行っています。
環境は以下の通りです。

j2sdk1.4.2
log4j1.2.8

log4j.xml内で指定したログファイル(test.log)を別のアプリで開いた状態で
Javaプログラムを実行するとコンソールに以下のエラーが出力されます。

【エラー発生処理】
DOMConfiturator.configure(log4j.xml);

【エラー内容】
log4j:ERROR setFile(null, true) call failed
java.io.FileNotFoundException : test.log(プロセスはファイルにアクセスできません。
別のプロセスが使用中です。)

ファイルを開いているために書き込めず、エラーになってしまうのは良いのですが、
ログを出力しないだけで処理自体は続行してしまいます。
(ログを書き込めなかったらそこで処理を終了したいです。)

「書き込めなかった場合に例外をcatchする」等のことは可能でしょうか?

A 回答 (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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
サンプルの記述もありがとうございます。
エラークラスは自作していたので、Appenderクラスを参考にさせて頂きました。

お礼日時:2010/06/11 18:46

質問はエラーへの対処じゃないのね。



やり方としてはオリジナルのLoggerを作成することね。
その内部で例外処理を記述すればいいわ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
エラーが発生すること自体はOKなので、Loggerを作成してみます。

お礼日時:2010/06/11 18:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています