2017-08-25 19 views
1

複数のロガーで同じファイルハンドラを使用することをお勧めしますか?私はJavaのロギングフレームワークを使用しています。異なるロガーを同じログファイルに書きたいのですが、以下のコード例が優れたプログラミングスタイルかどうかはわかりません。複数のロガーで同じハンドラを使用できますか?

import java.io.*; 
import java.util.logging.*; 

public class Alpha { 
    private static final Logger LOGGER = Logger.getLogger(Alpha.class.getName()); 
    private static FileHandler loggingHandler; 

    static { 
     try { 
      loggingHandler = new FileHandler("logfile.log", true); 
      LOGGER.addHandler(loggingHandler); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static FileHandler getLoggingHandler() { 
     return loggingHandler; 
    } 
} 

class Beta { 
    private static final Logger LOGGER = Logger.getLogger(Beta.class.getName()); 

    static { 
     LOGGER.addHandler(Alpha.getLoggingHandler()); 
    } 
} 

答えて

0

回答yes.Youは、他のクラスまたはスレッド試行がそれのコピーを作成するようにsingletonログ・クラスを作成する実際には同じインスタンスを使用することにより、(例えば)これを達成することができるです。 java.util.logging

実装例:

public class LogMe {   
    private static LogMe logMe; 
    private static Logger logger;  
    private static FileHandler fh; 
    private static Formatter sf; 

    public LogMe() { 
    //Make this class a singleton 
     if (logMe != null) { 
      return; 
     } 

     //Create the log file    
     try { 
     fh = new FileHandler("../xyz/LogFile.log"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    sf = new SimpleFormatter(); 
    fh.setFormatter(sf);    
    logger.addHandler(fh); 

    //Part of making this class a singleton 
    logger = Logger.getLogger("LogMe"); 
    logMe = this;   
} 

public Logger getLogger() { 
    return LogMe.logger; 
} 
} 

は、その後、あなたがこのようにそれを使用するあなたのクラスで:

class MyClass1 { 
    LogMe logMe1 = new LogMe(); 
    Logger logger2 = logMe1.getLogger(); 
    logger.info("X 01"); 
} 
+0

ありがとうございました。 –

+0

それは役に立ちましたか? – Mandy8055

+0

はい、それは:-) –

1

私はのために一つのファイルハンドラを使用してすべての問題を見ていません複数のロガー。しかし、常にそれがAlphaBeta両方の親ロガーであるとして通常あなただけのルートロガーLogger.getLogger("")上の単一のハンドラをインストールします別のプロパティファイルまたはいくつかの構成データベース

0

にファイルハンドラの構成を有しているために、より良い習慣です。

ただし、兄弟にハンドラをインストールする場合は、LogManager config option or the java.util.logging.config.class system propertyを使用してログ設定を作成する必要があります。

package app.configs; 

import java.io.IOException; 
import java.util.logging.FileHandler; 
import java.util.logging.Logger; 

public final class SharedHandlerConfig { 

    private static final Logger[] LOGGERS 
      = new Logger[]{Logger.getLogger(Alpha.class.getName()), 
       Logger.getLogger(Beta.class.getName())}; 

    private static final FileHandler FILE; 

    static { 
     try { 
      FileHandler f = new FileHandler("../xyz/logfile.log", true); 
      try { 
       for (Logger l : LOGGERS) { 
        l.addHandler(f); 
       } 
       FILE = f; 
       f = null; 
      } finally { 
       if (f != null) { 
        f.close(); 
        for (Logger l : LOGGERS) { 
         l.removeHandler(f); 
        } 
       } 
      } 
     } catch (IOException e) { 
      throw new ExceptionInInitializerError(e); 
     } 
    } 

    /** 
    * From startup system property: 
    * -Djava.util.logging.config.class=app.configs.SharedHandlerConfig 
    * 
    * From logging.properties: 
    * config=app.configs.SharedHandlerConfig 
    */ 
    public SharedHandlerConfig() { 
    } 
} 
+0

親ロガーの使用も良いアプローチであるようです。上の興味深いコードスニペット... –

関連する問題