Log4j使用不同的格式记录两次

hol*_*ltc 10 java log4j

我无法弄清楚为什么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文件,则仍会记录第二条日志消息(以及所有类似的消息).我怎么能阻止这个?谢谢!

hag*_*wal 5

我不熟悉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" />无论是在asyncmyAppender,我想没有Server started successfully日志将被打印出来(我想你已经尝试过用myAppender)

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

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

  1. 在标准输入/输出上打印,即终端窗口
  2. 在文件中打印以及prod环境

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


hol*_*ltc 0

问题解决了,我必须这样做:

<logger name="com.server" additivity="false">
    <level value="INFO" />
    <appender-ref ref="async" />
</logger>
Run Code Online (Sandbox Code Playgroud)