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

Log4j2-为什么我的“Logger”元素对我的“Root”Logger隐藏内容?

白学
2023-03-14

在有人把这个问题当成重复问题之前,听我说完...几天来,我已经通读了无数的博客文章、教程、常见问题和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 logger=LogManager初始化一个记录器。getLogger()

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

  • 所有INFO和更高级别的日志输出到文件

同时,如果我在启用了AppLogFileappender时运行该应用程序,我将获得更少的输出到控制台;仅在Log4j初始化后计数,我将获得255行,而不是367行。

查看控制台和文件输出,当启用AppLogFileappender时,我没有得到任何TRACEDEBUG输出,只有INFO和更高版本。当我注释掉那个appender(不改变任何其他东西),然后我得到所有的控制台,包括TRACEDEBUG

我尝试过重新排序控制台和文件相关的元素,我尝试过显式启用和禁用记录器的可加性属性,我尝试过在应用程序和记录器中使用过滤器,甚至在一个记录器中使用显式级别的多个appender引用属性。

我所要做的就是将所有内容都转到控制台,并将所有INFO级别和更高级别的内容转到文件。我在这里错过了什么。。?


共有1个答案

应安国
2023-03-14

级别属性和

>

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

    指定

    事实上,你同时做这两个,并不影响这些独立的效果。

    如果要限制Appender的日志条目,请在上指定级别属性。

    1)如果要更换附加器,则需要指定additivity=“false”

    (OP编辑)为了清晰起见,我从这个答案中学到的知识和Log4j2常见问题之间;我简化了一些事情,最后得到了以下

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

  •  类似资料:
    • 在有人把这个问题当作重复问题来解决之前,请听我说完...我已经读了无数的博客文章,教程,常见问题和问题,现在,我没有更接近理解为什么我会得到这种特殊的行为。 然后,每个类使用初始化一个记录器。 从我对日志级别、记录器和追加器的理解来看,这应该给我以下几点: 所有和更高级别日志记录输出到文件 到控制台的所有和更高级别日志记录输出 查看控制台和文件输出,当启用附加器时,我不会得到任何或输出,只有或更高

    • 我需要实现多个记录器和多个追加器。我的log4j2.xml如下所示: 现在,当我使用这个xml执行代码时,日志被写入最后一个日志文件commonres.log。我是Log4J的新手。如何只写入所需的日志文件? 编辑: 请帮忙。

    • Logger 是 Web 实时在线输出工具 , 支持在电脑浏览器 , 手机端查看,让你的手机变成你的调试法宝。 使用 token 支持不同项目同时调试,这是一个在支持实时显示程序运行状况的网络在线调试程序。 sender 文件夹下是 各种语言的的调试类.目前支持php 几种语言 server 服务端用于连接和转发调试信息 watch 是浏览器端用于将调试信息实时的展示在网页上面. 客户端代码在拖到浏览器上就可以了。

    • go-logger 是golang 的日志库 ,基于对golang内置log的封装。 用法类似java日志工具包log4j 打印日志有5个方法 Debug,Info,Warn, Error ,Fatal 日志级别由低到高 设置日志级别的方法为:logger.SetLevel() 如:logger.SetLevel(logger.WARN) 则:logger.Debug(....),logger.I

    • go-logger 一个简单而强大的 golang 日志工具包     English document 功能 支持同时输出到 console, file, url 命令行输出字体可带颜色 文件输出支持根据 文件大小,文件行数,日期三种方式切分 文件输出支持根据日志级别分别保存到不同的文件 支持异步和同步两种方式写入 支持 json 格式化输出 代码设计易扩展,可根据需要设计自己的 adapter

    • VC-Logger 是一个简单易用的 C++ 程序通用日志组件。设计时着重考虑三个方面:功能、可用性和性能。为了让大家能更方便的学习 VC-Logger,特此精心制作了几个测试用例:TestGUILogger(GUI 版本测试用例 / 静态加载)、TestDynamicLogger(GUI 版本测试用例 / 动态加载)、TestConsoleLogger(Console 版本测试用例 / 静态加载