当前位置: 首页 > 知识库问答 >
问题:

Log4j2-为什么我的“logger”元素要从我的“root”记录器中隐藏内容?

严易安
2023-03-14

在有人把这个问题当作重复问题来解决之前,请听我说完...我已经读了无数的博客文章,教程,常见问题和问题,现在,我没有更接近理解为什么我会得到这种特殊的行为。

<?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();初始化一个记录器。

从我对日志级别、记录器和追加器的理解来看,这应该给我以下几点:

  • 所有信息和更高级别日志记录输出到文件
  • 到控制台的所有跟踪和更高级别日志记录输出

查看控制台和文件输出,当启用applogfile附加器时,我不会得到任何tracedebug输出,只有info或更高的输出。当我只注释掉那个附加符(而不更改任何其他内容)时,我将所有内容都放到控制台,包括tracedebug

我试过重新排序“console”和“file”相关元素,试过显式启用和禁用记录器的additivility属性,试过在附加器和记录器中使用筛选器,甚至在一个具有显式level属性的记录器中使用多个附加器引用。

我想要的只是将所有内容都放到控制台,将所有info级别或更高的内容放到文件中。我错过了什么..?

共有1个答案

欧阳俊逸
2023-03-14

level属性和 元素完全独立:

>

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

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

    1)如果希望替换追加器,则需要指定additivity=“false”

    (OP编辑)为了清楚起见,在我从这个回答中学到的东西和Log4j2常见问题之间;我对此进行了一些简化,最后使用了以下 配置:

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

  •  类似资料:
    • 在有人把这个问题当成重复问题之前,听我说完...几天来,我已经通读了无数的博客文章、教程、常见问题和SO问题,但我还是不太明白为什么我会有这种特定的行为。 我的配置文件包含以下内容: 然后,每个类使用

    • 我有一个来自服务器的响应,我想把它放到列表中。但是当列表为空时,我需要隐藏这个div容器。例如,如果不在数组中-我想隐藏div。但是我想在ng之后使用bird重复,所以我不能使在上。我可以检查li是否为空,然后隐藏div吗? 普朗克例子 AngularJS ng-重复处理空列表大小写-这是不一样的。如果li是空的,我不想隐藏li,我想在li是空的时候隐藏父元素h1。

    • 问题内容: 我有一个非常简单的persistance.xml文件: 而且有效。 但是,当我删除元素时,应用程序看不到实体(所有类都带有注释)。 是否有自动扫描类的机制? 问题答案: 您可以使用persistence.xml 。从Java EE 5教程中 : 该文件定义了一个名为的持久性单元,它使用JTA感知数据源。所述和元素指定管持久类:实体类,可嵌入类和超类映射。该元素指定JAR文件都包含持久化

    • 我被这个概念困住了。 这是我在一个站点上看到的解释的一部分: 隐藏实现 我是这样想象的: 库客户机是否知道这个实现有什么区别?

    • 问题内容: 我在网页上遇到的一个常见问题是浮动div爬到了其容器之外。 有很多肮脏的方法可以解决此问题(将div插入clear:both) 我看到的一个更整洁的解决方案是将wrapper divs溢出样式设置为隐藏: 这在所有浏览器上都能很好地工作,并且干净利落,没有任何额外的标记。我很高兴,但我不知道为什么会起作用! 我看过的所有文档都表明溢出:隐藏是为了隐藏内容,而不是调整父级的大小以适合其子

    • 问题内容: 我在网页上遇到的一个常见问题是浮动div爬到了其容器之外。 有很多肮脏的方法可以解决此问题(将div插入clear:both) 我看到的一个更整洁的解决方案是将wrapper divs溢出样式设置为隐藏: 这在所有浏览器上都能很好地工作,并且干净利落,没有任何额外的标记。我很高兴,但我不知道为什么会起作用! 我看过的所有文档都表明溢出:隐藏是为了隐藏内容,而不是调整父级的大小以适合其子