Using org.apache.log4j.jdbc.JDBCAppender, how can I get stracktraces logged with warn and error into the PatternLayout.>
log4j 1.2.16+ 's EnhancedPatternLayout is not work! because it extends org.apache.log4j.Layout rather than org.apache.log4j.PatternLayout, but in JDBCAppender:
public void setSql(String s) {
sqlStatement = s;
if (getLayout() == null) {
this.setLayout(new PatternLayout(s));
}
else {
((PatternLayout)getLayout()).setConversionPattern(s); //Point1
}
}
So if you use JDBCAppender like this:
log4j.appender.JDBC=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.JDBC.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.JDBC.sql=INSERT INTO email_send_error(insert_date, level, location, message, stacktrace) VALUES (now(), '%p', '%C,%L', '%m', '%throwable{short}')
will throw a ClassCastException in Point1:
Caused by: java.lang.ClassCastException: org.apache.log4j.EnhancedPatternLayout cannot be cast to org.apache.log4j.PatternLayout
at org.apache.log4j.jdbc.JDBCAppender.setSql(JDBCAppender.java:330)
EDIT (after in-depth research):
Use log4j.appender.JDBC.layout.ConversionPattern instead of log4j.appender.JDBC.sql, will avoid above ClassCastException:
log4j.appender.JDBC.layout.ConversionPattern=INSERT INTO email_send_error(insert_date, level, location, message, stacktrace) VALUES (now(), '%p', '%C,%L', '%m', '%throwable{short}')
and don't forget record the throwed exception to logger:
logger.error(String errorMsg, Throwabe e); // Dont forget e