Log4j:为什么根logging器收集所有日志types而不考虑configuration?

我有一个问题,即使我在根标记中指定错误级别,指定的appender会将所有级别(debug,info,warn)logging到文件中,而不pipe设置如何。 我不是一个log4j专家,所以任何帮助表示赞赏。

以下是关于这个主题的更多信息:

  • 我已经检查log4j.properties的类path(没有),除了log4j.xml

这里是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> 

如果我用另一个logging器replace根,那么根本没有logging到指定的appender。

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

…并感谢你们提示到目前为止:-)

根logging器驻留在logging器层次结构的顶部。 在三个方面是例外:

  • 它始终存在,
  • 其级别不能设置为空
  • 它不能被名称检索。

rootLogger是所有appender的父亲。 给定logging器的每个启用的logging请求将被转发给该logging器中的所有appender以及层次结构中较高的appender(包括rootLogger)

例如,如果console appender被添加到root logger日志root logger ,则所有启用的日志logging请求将至less在控制台上打印。 如果另外一个文件appender被添加到一个logging器,比如L ,那么为LL's孩子启用的logging请求将打印在文件 console 。 可以重写此默认行为,以便通过将可加性标志设置为false来使appender累积不再具有可加性

从log4j手册

总结一下:

如果你不想传播一个logging事件给父母logging器(比如说rootLogger),那么在这些logging器中添加可加性标志为false。 在你的情况下:

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

在标准的log4jconfiguration风格(我更喜欢XML):

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

希望这可以帮助。

用-Dlog4j.debug运行你的程序,这样标准输出得到关于如何configurationlog4j的信息 – 我怀疑它没有按你认为的方式configuration。

添加到James AN Stauffer和玩世不恭的人所说的话 – 我敢打赌,你的类path上还有另一个log4j.xml / log4j.properties,而不是你希望使用的log4j.xml / log4j.properties,它会导致log4j按照它自己的方式进行configuration。

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

两件事情:检查可加性,并决定是否希望更详细的日志级别捕获的日志事件传播到根日志logging器。

其次,检查根logging器的级别。 另外你也可以在appender本身上添加filter,但是通常这不是必须的。

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

这是正确的行为。 根logging器就像缺省行为一样。 所以,如果你没有指定任何logging器,它将把根logging器级别作为缺省级别,但这并不意味着根级别是所有日志的级别。

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

因此,如果使用除root以外的logging器,则根logging级别将被该logging器的日志级别覆盖。 要获得所需的输出将另外两个日志级别更改为ERROR。

我希望这是有帮助的。