2017-08-25 57 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

我没有看到任何问题与使用一个文件处理程序多个记录器。然而,它始终是更好的做法,有文件处理程序配置为单独的属性文件或部分配置数据库

0

通常你只需要安装上的根记录器Logger.getLogger("")一个处理程序,既AlphaBeta的父logger。

但是,如果您想要在兄弟上安装处理程序,那么您应该使用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

父记录器的使用似乎也是一个很好的方法。有趣的代码片断从上面... –

相关问题