我无法弄清楚为什么log4j会以不同的格式附加两次.有没有人遇到过这个?
这是我的log4j.xml文件:
<log4j:configuration>
<appender name="async" class="org.apache.log4j.AsyncAppender">
<!-- this parameter need to be set to false to avoid application from hanging. -->
<param name="Blocking" value="false" />
<appender-ref ref="myAppender" />
</appender>
<appender name="myAppender" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="INFO" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{ISO8601} [%t] %c %x - %m%n" />
</layout>
</appender>
<logger name="com.server">
<level value="INFO" />
</logger>
<logger name="org.springframework">
<level value="INFO" />
</logger>
<logger name="org.hibernate.LazyInitializationException" additivity="false">
<level value="off" />
<appender-ref ref="async" />
</logger>
<logger name="net.sf.ehcache">
<level value="INFO" />
</logger>
<logger name="com.mchange">
<level value="INFO" />
</logger>
<root>
<priority value="INFO" />
<appender-ref ref="async" />
</root>
</log4j:configuration>
Run Code Online (Sandbox Code Playgroud)
以下是一些示例输出:
INFO 2016-08-26 11:01:38,353 [main] com.server.Server - Server started successfully...
11:01:38,353 INFO : Server started successfully...
Run Code Online (Sandbox Code Playgroud)
编辑:当我将"myAppender"appender阈值更改为"ERROR"时,仍然会生成显示的第二条日志消息(以时间开头,而不是"INFO").我需要禁用一些默认记录器吗?似乎有些东西仍在记录那些"INFO"级别的消息,即使指定的appender用于"ERROR"级别消息.此外,如果我注释掉整个log4j.xml文件,则仍会记录第二条日志消息(以及所有类似的消息).我怎么能阻止这个?谢谢!
我不熟悉log4j的XML语法(我使用log4j.properties进行配置)所以这是我的2美分,试图帮助您调试和修复代码.
首先尝试使用下面的根记录器配置而不是你的<appender-ref ref="async" />-
<logger name="org.hibernate.LazyInitializationException" additivity="false">
<level value="off" />
<appender-ref ref="myAppender" />
</logger>
..............
...........
<root>
<priority value="INFO" />
<appender-ref ref="myAppender" />
</root>
Run Code Online (Sandbox Code Playgroud)
如果以上不工作,那么,尝试把<param name="Threshold" value="ERROR" />无论是在async和myAppender,我想没有Server started successfully日志将被打印出来(我想你已经尝试过用myAppender)
如果这有助于那么它意味着您尝试引用/继承记录器的方式无法正常工作或使用,因此您从这个方向思考并纠正问题,您需要阅读有关appender-ref元素和AsyncAppender记录器的更多信息.
无论上面是否有效,我猜你正在努力实现以下目标 -
我会在log4j.properties中执行此操作,如下所示:
log4j.logger.com.sks.cs50=DEBUG, CS50GlobalFileAppender, stdout
#####CS50 Web log##########
log4j.appender.CS50GlobalFileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.CS50GlobalFileAppender.File=${logDir}cs50.log
log4j.appender.CS50GlobalFileAppender.MaxBackupIndex=50
log4j.appender.CS50GlobalFileAppender.Threshold=DEBUG
log4j.appender.CS50GlobalFileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.CS50GlobalFileAppender.layout.ConversionPattern=%C %d [%t] [%X{randomNumber}] %-5p - %m%n
log4j.appender.CS50GlobalFileAppender.MaxFileSize=500000KB
# Log format to standard output
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%X{randomNumber}] %-5p - %m%n
log4j.logger.org.apache = INFO
log4j.logger.com.sun = INFO
log4j.logger.sun = INFO
log4j.logger.javax.xml.bind = INFO
log4j.logger.org.springframework = INFO
log4j.logger.com.cgi = DEBUG
Run Code Online (Sandbox Code Playgroud)
所以,我想你可以做如下的事情.
<log4j:configuration>
<appender name="async" class="org.apache.log4j.AsyncAppender">
<!-- this parameter need to be set to false to avoid application from hanging. -->
<param name="Blocking" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{ISO8601} [%t] %c %x - %m%n" />
</layout>
</appender>
<appender name="myAppender" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="INFO" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{ISO8601} [%t] %c %x - %m%n" />
</layout>
</appender>
<logger name="com.server">
<level value="INFO" />
</logger>
<logger name="org.springframework">
<level value="INFO" />
</logger>
<logger name="org.hibernate.LazyInitializationException" additivity="false">
<level value="off" />
<appender-ref ref="async" />
</logger>
<logger name="net.sf.ehcache">
<level value="INFO" />
</logger>
<logger name="com.mchange">
<level value="INFO" />
</logger>
<root>
<priority value="INFO" />
<appender-ref ref="async" />
<appender-ref ref="myAppender" />
</root>
</log4j:configuration>
Run Code Online (Sandbox Code Playgroud)
请注意,上面的XML配置假设org.apache.log4j.AsyncAppender在某些日志文件中打印,但如果没有(我猜它没有),那么上面的内容将不起作用(您仍然可以使用上面的XML配置来实现文件+控制台日志记录,如果你AsyncAppender用a 替换,org.apache.log4j.RollingFileAppender我想知道你为什么不能org.apache.log4j.AsyncAppender直接使用,因为它已经打印到控制台,所以可能只是使用:
<appender name="async" class="org.apache.log4j.AsyncAppender">
<!-- this parameter need to be set to false to avoid application from hanging. -->
<param name="Blocking" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{ISO8601} [%t] %c %x - %m%n" />
</layout>
</appender>
Run Code Online (Sandbox Code Playgroud)
问题解决了,我必须这样做:
<logger name="com.server" additivity="false">
<level value="INFO" />
<appender-ref ref="async" />
</logger>
Run Code Online (Sandbox Code Playgroud)