log4j 1.2.16+ EnhancedPatternLayout не работает! потому что он расширяет org.apache.log4j.Layout, а не org.apache.log4j.PatternLayout, но в JDBCAppender:
public void setSql(String s) {
sqlStatement = s;
if (getLayout() == null) {
this.setLayout(new PatternLayout(s));
}
else {
((PatternLayout)getLayout()).setConversionPattern(s); //Point1
}
}
Так что, если вы используете JDBCAppender следующим образом:
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}')
сгенерирует исключение ClassCastException в Point1:
Причина: java.lang.ClassCastException: org.apache.log4j.EnhancedPatternLayout нельзя преобразовать в org.apache.log4j.PatternLayout
в org.apache.log4j.jdbc.JDBCAppender.setSql (JDBCAppender.java:330)
РЕДАКТИРОВАТЬ (после углубленного исследования):
Используйте log4j.appender.JDBC.layout.ConversionPattern вместо log4j.appender.JDBC.sql , избегая выше 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}')
и не забудьте записать выданное исключение в логгер:
logger.error(String errorMsg, Throwabe e); // Dont forget e