首页 文章

Log4j:为什么根 Logger 收集所有日志类型而不管配置如何?

提问于
浏览
38

我有问题,即使我在根标签中指定ERROR级别,指定的appender会将所有级别(debug,info,warn)记录到文件中,而不管设置如何 . 我不是log4j专家,所以任何帮助表示赞赏 .

以下是有关该主题的更多信息:

  • 我已经检查了除log4j.xml之外的log4j.properties(没有)的类路径

这是log4j.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>


    <!-- ============================== -->
    <!-- Append messages to the console -->
    <!-- ============================== -->


    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />

        <layout class="org.apache.log4j.PatternLayout">
            <!-- The default pattern: Date Priority [Category] Message\n -->
            <param name="ConversionPattern" value="[AC - %5p] [%d{ISO8601}] [%t] [%c{1} - %L] %m%n" />
        </layout>
    </appender>

    <appender name="logfile" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/server.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="2" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

    <appender name="payloadAppender" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/payload.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

    <appender name="errorLog" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/error.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

    <appender name="traceLog"
        class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/trace.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="20" />

        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="[AccessControl - %-5p] {%t: %d{dd.MM.yyyy - HH.mm.ss,SSS}} %m%n" />
        </layout>
    </appender>

    <appender name="traceSocketAppender" class="org.apache.log4j.net.SocketAppender">
        <param name="remoteHost" value="localhost" />
        <param name="port" value="4445" />
        <param name="locationInfo" value="true" />
    </appender>

    <logger name="TraceLogger">
        <level value="trace" /> <!-- Set level to trace to activate tracing -->
        <appender-ref ref="traceLog" />     
    </logger>

    <logger name="org.springframework.ws.server.endpoint.interceptor">
        <level value="DEBUG" />
        <appender-ref ref="payloadAppender" />
    </logger>

    <root>
        <level value="error" />
        <appender-ref ref="errorLog" />
    </root>

</log4j:configuration>

如果我用另一个 Logger 替换root,那么根本没有任何记录到指定的appender .

<logger name="com.mydomain.logic">
    <level value="error" />
    <appender-ref ref="errorLog" />
</logger>

...谢谢你们到目前为止的提示:-)

6 回答

  • 70

    根 Logger 位于 Logger 层次结构的顶部 . 它有三种方式:

    • 它总是存在的,

    • 其级别不能设置为null

    • 无法按名称检索 .

    The rootLogger is the father of all appenders. Each enabled logging request for a given logger will be forwarded to all the appenders in that logger as well as the appenders higher in the hierarchy (including rootLogger)

    例如,如果将 console appender添加到 root logger ,则所有已启用的日志记录请求将在控制台上打印 at least . 如果另外将文件追加器添加到 Logger ,例如 L ,则 LL's 子项的启用日志记录请求将打印在 console 上的文件 and 上 . 可以覆盖此默认行为,以便appender累积不再是添加的 by setting the additivity flag to false .

    来自log4j手册

    总结一下:

    如果您不想将日志记录事件传播到父 Logger (例如rootLogger),则在这些 Logger 中将additivity标志添加到false . 在你的情况下:

    <logger name="org.springframework.ws.server.endpoint.interceptor"
            additivity="false">
            <level value="DEBUG" />
            <appender-ref ref="payloadAppender" />
    </logger>
    

    在标准的log4j配置样式(我更喜欢XML):

    log4j.logger.org.springframework.ws.server.endpoint.interceptor = INFO, payloadAppender
    log4j.additivity.org.springframework.ws.server.endpoint.interceptor = false
    

    希望这可以帮助 .

  • 2

    使用-Dlog4j.debug运行程序,以便标准输出获取有关如何配置log4j的信息 - 我怀疑它没有按照您认为的方式进行配置 .

  • 4

    再加上James A. N. Stauffer和愤世嫉俗者所说的 - 我敢打赌你的类路径上还有另一个log4j.xml / log4j.properties,而不是你希望使用的那个,导致log4j以它的方式配置自己 .

    -Dlog4j.debug 是解决任何log4j问题的绝对杀手方法 .

  • 0

    两件事:检查可加性并决定是否希望通过更详细的日志记录级别捕获的日志事件传播到根 Logger .

    其次,检查根 Logger 的级别 . 此外,您还可以在appender本身上添加过滤,但通常不需要这样做 .

  • 5

    如果您使用的是 log4j.properties 文件,则通常希望此文件位于类路径的根目录中,因此请确保它在那里 .

  • 8

    这是正确的行为 . 根 Logger 就像默认行为一样 . 因此,如果您未指定任何 Logger ,则它将根 Logger 级别作为默认级别,但这并不意味着根 Logger 级别是所有日志的级别 .

    使用'TraceLogger'logger或'org.springframework.ws.server.endpoint.interceptor' Logger 记录的任何代码都将使用TRACE和DEBUG级别分别记录消息,任何其他代码将使用root Logger 使用级别记录消息,这是在你的情况下错误 .

    因此,如果您使用除root之外的logger,则root日志级别将被该 Logger 的日志级别覆盖 . 要获得所需的输出,请将另外两个日志级别更改为ERROR .

    我希望这是有帮助的 .

相关问题