gpt4 book ai didi

java - Log4j2 - 为什么我的 "Logger"元素隐藏了 "Root"记录器的内容?

转载 作者:行者123 更新时间:2023-12-02 12:44:04 26 4
gpt4 key购买 nike

在有人将这个问题作为重复问题关闭之前,请听我说完......我已经阅读了数天的无数博客文章、教程、常见问题解答和SO问题,但我并没有更接近理解为什么 我遇到了这种特定的行为。

<小时/>

配置

我的log4j2.xml配置文件包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Properties>
<Property name="APP_NAME">MyCoolApp</Property>
<Property name="BASE_PACKAGE">my.cool.package</Property>
<Property name="LOG_DIR">${env:LOG_ROOT:-logs}</Property>
<Property name="LOG_PATTERN">%d [%t] %-5level %c{1.}:%L:%M | %m%n</Property>
</Properties>

<Appenders>
<RollingFile name="AppLogFile" fileName="${LOG_DIR}/${APP_NAME}.log" filePattern="${LOG_DIR}/archive/${APP_NAME}.%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<TimeBasedTriggeringPolicy/>
</RollingFile>

<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
</Appenders>

<Loggers>
<Logger name="${BASE_PACKAGE}" level="INFO">
<AppenderRef ref="AppLogFile"/>
</Logger>

<Root level="TRACE">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

然后每个类都用 private static final Logger LOGGER = LogManager.getLogger(); 初始化一个记录器.

运行时

根据我对日志级别、记录器和附加程序的理解,这应该给我以下内容:

  • 全部 INFO以及更高级别的日志输出到文件
  • 全部 TRACE以及更高级别的日志输出到控制台

同时,如果我在 AppLogFile 时运行应用程序启用附加器后,我得到的控制台输出较少;仅在 Log4j 初始化之后开始计数,我得到了 255 行,而相比之下,我得到了 367 行。

查看控制台和文件输出,当 AppLogFile附加器已启用,我没有得到任何TRACEDEBUG输出,仅INFO和更高。当我注释掉该附加程序(不更改任何其他内容)时,我会将所有内容都发送到控制台,包括 TRACEDEBUG .

我尝试过重新排序“控制台”和"file"相关元素,我尝试过显式启用和禁用记录器的 additivity属性,我尝试在附加器和记录器中使用过滤器,甚至在一个记录器内使用显式 level 的多个附加器引用。属性。

我想要的就是将所有内容都转到控制台以及所有内容 INFO级别及更高级别以转到文件。我在这里缺少什么......?

最佳答案

level属性和 <AppenderRef>元素完全独立:

  • 指定level 更改给定记录器和所有子记录器的日志记录级别。

  • 指定<AppenderRef> 向给定记录器和所有子记录器添加1另一个附加程序。

事实上,您同时执行这两项操作,不会影响这些独立的效果。

如果要限制 Appender 的日志条目,请指定 level <AppenderRef> 上的属性相反。

1) 如果您希望Appender替换,您需要指定additivity="false"

<小时/>

(OP edit) Just for the sake of clarity, between what I learned from this answer and the Log4j2 FAQ; I streamlined things a bit and ended up with the following <Loggers> configuration:

<Loggers>
<Root level="TRACE">
<AppenderRef ref="AppLogFile" level="INFO"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>

关于java - Log4j2 - 为什么我的 "Logger"元素隐藏了 "Root"记录器的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44845474/

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