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する」等のことは可能でしょうか?
No.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
ご回答ありがとうございます。
サンプルの記述もありがとうございます。
エラークラスは自作していたので、Appenderクラスを参考にさせて頂きました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java Javaについて質問です。 勉強し始めたばかりの初心者です。 相続税について課税額を算出するコードを 1 2022/05/31 19:02
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
Log4jで機能毎に別ファイルへ出力する方法
Java
-
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
count(*)で取得した値をJAVAの変数に代入するには?
Java
-
-
4
log4j.xmlファイルの読込で。。。
Java
-
5
Path型をString型へ変換する(Java)
Java
-
6
Winmerge ファイルの中身は同じなのに黄色くなる
その他(OS)
-
7
コマンドプロンプトのエラーについて
その他(パソコン・周辺機器)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドライン引数の*(アフ...
-
変数を動的に利用するには?
-
日本語が文字コードによっては...
-
クラスを使った電卓のプログラム
-
javaのプログラミングで作るRPG...
-
Java プログラム public class ...
-
DESを使用した暗号化/復号化処...
-
JSP/Servletのパラメータの受け...
-
NoSuchMethodErrorが解決できま...
-
中カッコ{}だけの記述について
-
System.exit()の値を取得したい
-
Socketの接続のタイムアウトを...
-
プログラミングの問題です。大...
-
数字の大小の比較とテストメソッド
-
コンストラクタの引数の中のnew?
-
java.util.concurrent.Future g...
-
StringクラスのcompareToメソッド
-
Javaがうまく動作しない理由
-
TCPプログラミング
-
ArrayList でスタックを
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングの問題です。大...
-
変数を動的に利用するには?
-
中カッコ{}だけの記述について
-
System.exit()の値を取得したい
-
Javaでlog4jを使ってログ出力を...
-
NoSuchMethodErrorが解決できま...
-
javaで特定の文字列から特定の...
-
Socketの接続のタイムアウトを...
-
Java プログラム public class ...
-
javaのプログラミングで作るRPG...
-
インタフェイス実装と抽象クラ...
-
コマンドライン引数の*(アフ...
-
【初心者です】javaで平均値を...
-
Javaで日本語の出力が文字化けする
-
(大至急)JavaでATMもどきを作成
-
コンストラクタの引数の中のnew?
-
Java 最大公約数 gcd
-
C# DatagridviewにExcelシート...
-
randomで
-
GetterとSetterをやったのに。
おすすめ情報