在哪里定义静态应用程序范围的记录器?

yeg*_*256 5 java logging

我的Java Web应用程序中有许多包.在其中一些我使用这个结构:

public class Foo {
  private static Logger logger = LoggerFactory.getLogger("com.XXX");
  public void bar() {
    Foo.logger.debug("Method bar() was just called");
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,这只是一个例子.一切正常,但我不喜欢许多类中记录器初始化的想法.这是一个明显的代码重复.我想将它移动到一个帮助类,让所有其他类访问它.这是一个正确的想法吗?或者也许还有其他"最佳实践"或模式?

Mar*_*ers 8

说这是代码重复,就像说import java.util.*你的75%的类是代码重复.或者你发现自己public class ...经常写作.这不是重复逻辑.它是复制样板代码.

代码重复只涉及复制逻辑时的设计气味.如果有太多的样板代码,那真的是一种语言设计的味道.你真的不应该担心什么.

在缺点方面,如果放弃层级结构,则无法微调日志记录.


小智 5

如果你使用集中的全局静态记录器constrcut而不是常见的Log4J调用/ inits,我认为你不会赢得任何东西.

如果你写

private static Logger logger = LoggerFactory.getLogger("com.XXX");
logger.info("Hello World");
Run Code Online (Sandbox Code Playgroud)

或类似的东西

GlobalLogger.info(this, "LogMessage");  //Singleton...
Run Code Online (Sandbox Code Playgroud)

...不会让你的代码更"可读".


And*_*s_D 3

您可以编写自己的实用程序类,它包装全局记录器并实现记录器方法的静态委托。然后只需静态导入此类:

public class MyLogger {
  private static Logger logger = LoggerFactory.getLogger("application");

  public static void debug(String s) {logger.debug(s));}

  public static void debug(Class<?> caller, String s) {
     LoggerFactory.getLogger(caller.getName()).debug(s);
  }

  // ...
}
Run Code Online (Sandbox Code Playgroud)

用法:

import static MyLogger.*;

public class Foo {
  public void bar() {
    // makes use of static import!
    debug("Method bar() was just called"); 
    debug(this.getClass(), "Method bar() was just called"); 
  }
}
Run Code Online (Sandbox Code Playgroud)

添加了示例debug委托的重载版本,该委托采用类对象并使用适当的记录器。