我的问题非常具体在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转换字之间是否有区别?