Java日志框架,它不需要每个类的LOGGER声明
我尝试了以下记录器
所有这些都需要在课堂级别进行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的类注解。
上一篇: Java logging framework which does not require LOGGER declaration on every class