%throwable转换字的Log4J和Logback实现之间的区别

时间:2014-12-15 19:36:10

标签: logging log4j logback syslog

我的问题非常具体在Log4J和Logback中使用%throwable或%ex转换字。

我将首先向您展示我的log4.xml和logback.xml内容(仅显示相关部分):

LOG4J.XML

<appender name="SYSLOG" class="org.productivity.java.syslog4j.impl.log4j.Syslog4jAppender"> 
    <param name="Facility" value="USER" />
    <param name="Port" value="514" />
    <param name="SyslogHost" value="syslogserver_ip" />
    <layout class="org.apache.log4j.EnhancedPatternLayout">
        <param name="ConversionPattern" value=" [%thread] %logger %m %throwable" />
    </layout>
</appender>

LOGBACK.XML

<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
    <syslogHost>syslogserver_ip</syslogHost>
    <port>514</port>
    <facility>USER</facility>
    <suffixPattern>[%thread] %logger %m %ex</suffixPattern>
</appender>

在阅读以下2个链接之后,我认为可以肯定地说,logback中的'%ex'转换字应该与log4j中的'%throwable'转换字相同。

https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html

http://logback.qos.ch/manual/layouts.html

但是在使用上述两种配置后,我的syslog服务器日志中似乎得到了2个不同的结果:

使用LOG4J

Dec 15 14:10:01 localhost  [main] SimpleTest Error Trace :  java.lang.ArrayIndexOutOfBoundsException
        at com.vksinghh.logback.example.SimpleTest.randomMethod2(SimpleTest.java:28)
        at com.vksinghh.logback.example.SimpleTest.randomMethod1(SimpleTest.java:24)
        at com.vksinghh.logback.example.SimpleTest.main(SimpleTest.java:13)

使用LOGBACK

Dec 15 14:12:09 localhost [main] SimpleTest Error Stack :  java.lang.ArrayIndexOutOfBoundsException: null
        at com.vksinghh.example.TestProjectLogback.App.randomMethod2(App.java:27)
        at com.vksinghh.example.TestProjectLogback.App.randomMethod1(App.java:23)
        at com.vksinghh.example.TestProjectLogback.App.main(App.java:13)
Dec 15 14:12:09 localhost  at com.vksinghh.example.TestProjectLogback.App.randomMethod2(App.java:27)
Dec 15 14:12:09 localhost  at com.vksinghh.example.TestProjectLogback.App.randomMethod1(App.java:23)
Dec 15 14:12:09 localhost  at com.vksinghh.example.TestProjectLogback.App.main(App.java:13)

这是生成错误消息的代码(在两种情况下都与我使用SLF4J相同)

public class App {  
    static Logger logger = LoggerFactory.getLogger("SimpleTest");
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            randomMethod1();
        } catch (Exception ae) {
            logger.error("Error Stack : ", ae);
        }
    }

    private static void randomMethod1() {
        randomMethod2();
    }

    private static void randomMethod2() {
        throw new ArrayIndexOutOfBoundsException();
    }  
}

LOG4J输出是我想要的,即与log语句一起出现的异常堆栈跟踪。 Logback似乎尊重%ex转换字,但也最终将堆栈跟踪中的每一行作为新消息发送。

我知道在syslog中使用logback并且换行有一些问题,但我会想到,一旦使用'%ex'转换字来处理异常堆栈跟踪,换行的问题就会消失。

Log4j的%throwable转换字和Logback的%ex转换字之间是否有区别?

0 个答案:

没有答案