Log4j2 - 为什么我的" Logger"元素隐藏来自我的" Root"记录仪?

时间:2017-06-30 11:32:11

标签: java logging log4j2

在有人将这个问题作为重复出现之前,请听我说......我已经阅读了无数博客文章,教程,常见问题和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 appender时运行应用程序,则控制台的输出会减少;仅在Log4j初始化之后计数,我获得255行而不是367。

查看控制台和文件输出,当AppLogFile appender启用时,我不会获得任何TRACEDEBUG输出,只有INFO和更高。当我只注释掉那个appender(没有更改任何其他内容)时,我会把所有内容都安排到控制台,包括TRACEDEBUG

我试过重新安排&#34;控制台&#34;和&#34;文件&#34;相关元素,我尝试明确启用和禁用记录器的additivity属性,我尝试在appender和logger中使用过滤器,甚至在一个记录器中使用显式的多个appender引用level属性。

我想要的只是让所有内容都转到控制台,所有INFO级别和更高级别都可以转到文件。我在这里错过了什么..?

1 个答案:

答案 0 :(得分:1)

tournament属性和level元素完全独立:

  • 指定<AppenderRef> 更改给定记录器和所有子记录器的记录级别。

  • 指定level 1 另一个appender添加到给定的记录器和所有子记录器。

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

如果您想限制Appender的日志条目,请改为指定<AppenderRef>上的level属性。

1)如果您希望Appender 替换,您需要指定<AppenderRef>

  

(OP编辑)为了清楚起见,我从这个答案和Log4j2 FAQ中学到了什么;我简化了一些事情并最终得到了以下additivity="false"配置:

<Loggers>