gpt4 book ai didi

不需要在每个类上都声明 LOGGER 的 Java 日志记录框架

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:31:58 29 4
gpt4 key购买 nike

我尝试了以下记录器

  • 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(..) 时,Logger 应该使用 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 将显示类名而不是记录器名称。这是此处使用的模式。

根据 the PatternLayout documentation%C 模式执行以下操作:

Outputs the fully qualified class name of the caller issuing the logging request.

重要说明,文档中也提到了:

Generating the class name of the caller (location information) is an expensive operation and may impact performance. Use with caution.

关于不需要在每个类上都声明 LOGGER 的 Java 日志记录框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592962/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com