2016-07-01 14 views
0

複数のJVMで実行されているが同じ%t(temp)ディレクトリにログを記録するツールがあります。 logging.propertiesファイルで%u(一意の)パターン変数を使用しているため、各インスタンスが別のログファイルに記録されます。現在のjava.util.logging.Loggerログファイル名の名前を出力するにはどうすればよいですか?

プロセスがエラーを検出した場合(これは監視ツールです)、電子メールを送信し、障害が発生した特定のインスタンスのログファイルを添付します。しかし、どのようにログファイルのパスを取得するのですか?これが良いものでないならば、喜んで受け入れられる方が良い方法だろう。

+0

各プログラムが別のログフォルダにログを記録したり、別のログファイル名/プレフィックスを使用したりすると、それほど整理されないでしょうか? – Andreas

+0

コメントありがとうございます。ログファイルは一度電子メールで送信されると「使い捨て」なので、実際には問題ではありません。誰もログファイルをブラウズすることはありません。いずれにしても、ログの設定だけではなく、プログラムでこの処理を行う必要があるように見えるので、最終的には整理されるでしょう。 – AndyJ

答えて

0

これをカバーする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は、監視ツールへのログ情報の全てを送信するための方法だろうと、あなたは保存したり、ログデータを送信することを決定し監視ツールを持つことができます。

+0

非常に参考になりました、多数の提案に感謝します! – AndyJ

関連する問題