gpt4 book ai didi

java - Log4j 以不同格式记录两次

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:56:56 26 4
gpt4 key购买 nike

我不明白为什么 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>

这里是一些示例输出:

INFO  2016-08-26 11:01:38,353 [main] com.server.Server  - Server started successfully...
11:01:38,353 INFO : Server started successfully...

编辑:当我将“myAppender”appender threshold 更改为“ERROR”时,显示的第二条日志消息(以时间开头的消息,而不是“INFO”)仍在生成。是否有一些我需要禁用的默认记录器?似乎某些东西仍在记录那些“INFO”级别的消息,即使指定的附加程序用于“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>

如果以上不起作用,请尝试输入 <param name="Threshold" value="ERROR" />都在 asyncmyAppender ,我想没有 Server started successfully将打印日志(我认为您已经尝试过 myAppender )

如果这有帮助,那么这意味着您尝试引用/继承记录器的方式没有正常工作或使用不正确,因此您已经从那个方向思考并纠正了问题,您需要阅读更多关于 appender-ref 的信息元素和 AsyncAppender记录器。

无论以上是否有效,我猜你正在努力实现以下目标 -

  1. 在您的标准输入/输出上打印,即您的终端窗口
  2. 在生产环境中打印文件

我会在 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

所以,我想你可以做如下的事情。

<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>

请注意上面的XML配置是假设org.apache.log4j.AsyncAppender打印在一些日志文件中,但如果它没有(我猜它没有)那么上面将不起作用(如果你将 AsyncAppender 替换为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>

关于java - Log4j 以不同格式记录两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39169388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com