Java 我应该继续将记录器实例传递给不同的类吗

Java 我应该继续将记录器实例传递给不同的类吗,java,logging,Java,Logging,我在main方法中创建了一个logger实例,并将其设置为全局变量。如果我想使用相同的日志文件来记录消息,那么将相同的记录器实例传递给不同的类构造函数是否是一种好的做法。否则你怎么能做到这一点而不是传球呢 public static void main(String[] args) { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss")

我在main方法中创建了一个logger实例,并将其设置为全局变量。如果我想使用相同的日志文件来记录消息,那么将相同的记录器实例传递给不同的类构造函数是否是一种好的做法。否则你怎么能做到这一点而不是传球呢

public static void main(String[] args) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
        Handler h = new FileHandler("../logs/MyLogFile_"
                + sdf.format(date) + ".log", true);
        h.setFormatter(new SingleLineFormatter());
        h.setLevel(Level.ALL);
        logger.setUseParentHandlers(false);
        logger.addHandler(h);
} 

public void go(XMLConfig config) throws Exception {      
    Controller.setGlobalErrorHandler(new ErrorHandler(logger));
} 

public class ErrorHandler implements FDSErrorHandler {

    private static Logger logger = Logger.getLogger("com.explore.lse");

    public ErrorHandler(Logger logger) {
        this.logger = logger; 
    }
}

不,绝对不是:-)

使用日志框架的常见模式是在打印到日志的每个类中都有一个私有的final static logger字段(当然,假设您选择的框架的记录器是线程安全的,大多数是):

然后,您可以使用日志配置(通常是xml)控制哪些类(=记录器)进入哪些文件

有时(“有时”很少被框架使用,并且大部分被框架使用),在检索日志时,您会使用“主题名”而不是类名。例如:

public class SomeSecurityRelatedClass {

   public void authenticateUser(String username, String pass) {
      if (!passCorrect(...)) {
         LoggerFactory.getLogger("SECURITY").info("rejecting user .... //etc
      }
   }
}
在聊天时,另一种常见的日志名称滥用是当人们希望在并发环境中以某种方式“标记”特定进程时(比如,您希望与同一用户的请求相关的所有日志都指向每个用户的同一文件)。不要为此滥用记录器名称。相反,你应该让自己熟悉这个概念。它们至少受和/或支持,可用于“标记”进程或向日志中添加任何其他额外数据

public class SomeSecurityRelatedClass {

   public void authenticateUser(String username, String pass) {
      if (!passCorrect(...)) {
         LoggerFactory.getLogger("SECURITY").info("rejecting user .... //etc
      }
   }
}