Java日志框架,它不需要每个类的LOGGER声明

我尝试了以下记录器

  • Java日志API
  • Log4j的
  • SLF4J
  • 所有这些都需要在课堂级别进行LOGGER声明,如下所示

    private final static java.util.logging.Logger.Logger LOGGER = java.util.logging.Logger.Logger.getLogger(MyClass.class.getName());
    private final Logger slf4jLogger = LoggerFactory.getLogger(SLF4JHello.class);
    private final static Logger log4jLogger = Logger.getLogger(Log4jHello.class);
    

    这对我来说看起来很可怕,是否有一个不需要此声明的java中的记录器框架?

    我在寻找的是,我可以有一个全球性的声明

    private final static Logger Logger = Logger.getLogger(MyApp.class);
    

    但是当我从类XXX.class中调用Logger.log(..)时 ,记录器应该使用XXX.class名称。


    你的问题不仅仅是日志框架,而是布局。

    具体的例子

    so35592962/App.java

    package so35592962;
    import org.apache.logging.log4j.*;
    import so35592962.sub.OtherClass;
    public class App {
      public static final Logger logger = LogManager.getLogger();
      public static void main(String[] args) {
        logger.error("in App.main");
        OtherClass.act();
      }
    }
    

    so35592962/sub/OtherClass.java

    package so35592962.sub;
    import static so35592962.App.logger;
    
    public class OtherClass {
      public static void act() {
        logger.error("OtherClass.act");
      }
    }
    

    所以你可以看到这完全是你想要的:使用单个记录器的类。 如此好的一点,Log4J2可以用于此。

    现在我添加魔术文件log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
      <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
          <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n"/>
        </Console>
      </Appenders>
      <Loggers>
        <Root level="error">
          <AppenderRef ref="Console"/>
        </Root>
      </Loggers>
    </Configuration>
    

    运行这将打印:

    12:05:28.834 [main] ERROR so35592962.App - in App.main
    12:05:28.836 [main] ERROR so35592962.sub.OtherClass - OtherClass.act
    

    看,这里有不同的类名! 然而我用Log4J2。

    这里发生了什么?

    请注意PatternLayout标签中使用的模式:

    %d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n

    标准示例以及您通常在Internet上看到的内容都使用%L模式。 这种模式是显示记录器名称。 但是你说你不想要它。 幸运的是,还有其他模式。 %C将显示类名而不是记录器名称。 这是在这里使用的模式。

    根据PatternLayout文档, %C模式执行以下操作:

    输出发出日志记录请求的调用者的全限定类名称。

    重要提示,也在文档中提到:

    生成调用方的类名(位置信息)是一项昂贵的操作,可能会影响性能。 谨慎使用。


    你可以将这两个变成Lombok的类注解。

  • @的Log4j
  • @ SLF4J
  • 链接地址: http://www.djcxy.com/p/32523.html

    上一篇: Java logging framework which does not require LOGGER declaration on every class

    下一篇: TFRecords and record shuffling