これをカバーするJDK-4798814 getFiles() needed for java.util.logging.FileHandlerの下にOracleに提出されたRFEがあります。
セキュリティマネージャを使用していない場合は、リフレクションに頼ることができます。
public class GetFileHandler extends FileHandler {
public GetFileHandler() throws IOException {
super();
}
/**
* Gets the files used by this handler. Index zero is the file that is
* in use.
*
* @return a array of files.
* @throws IOException if there is an error.
* @throws SecurityException if not allowed.
*/
public File[] getFiles() throws IOException {
return GetFileHandler.getFiles(this);
}
private static File[] getFiles(FileHandler h) throws IOException {
try {
Field f = FileHandler.class.getDeclaredField("files");
f.setAccessible(true);
synchronized (h) {
return ((File[]) f.get(h)).clone();
}
} catch (ReflectiveOperationException roe) {
throw new IOException(roe);
}
}
}
この解決策は、ファイルの回転に競合する可能性があることに注意してください。 FileHandlerのソースコードが変更された場合でも、破損する可能性があります。
ローテーションが必要ない場合は、いつでもStreamHandlerを拡張して既知のファイルの場所を指定できます。監視ツールは、着信TCP接続をサポートしている場合
public class KnownFileHandler extends StreamHandler {
private final File file;
public KnownFileHandler() throws IOException {
String v = LogManager.getLogManager().getProperty(getClass().getName() +".name");
if(v == null) {
v = "knownfilehandler.log";
}
file = new File(v);
this.setOutputStream(new FileOutputStream(file));
}
public File getFile() {
return this.file;
}
}
そしてjava.util.logging.SocketHandlerは、監視ツールへのログ情報の全てを送信するための方法だろうと、あなたは保存したり、ログデータを送信することを決定し監視ツールを持つことができます。
各プログラムが別のログフォルダにログを記録したり、別のログファイル名/プレフィックスを使用したりすると、それほど整理されないでしょうか? – Andreas
コメントありがとうございます。ログファイルは一度電子メールで送信されると「使い捨て」なので、実際には問題ではありません。誰もログファイルをブラウズすることはありません。いずれにしても、ログの設定だけではなく、プログラムでこの処理を行う必要があるように見えるので、最終的には整理されるでしょう。 – AndyJ