Using org.apache.log4j.jdbc.JDBCAppender, how can I get stracktraces logged with warn and error into the PatternLayout.>
Solution is we need to use EnhancedPattern Layout, by using this we can log the entire stack trace into DB. But there is one issue if we use this if the Stacktrace contain comma(,) , the message will not be get logged.I have solve this by over writing getLogStatement() which is available in JDBC appender Sourcecode
Follow the following steps
Download Log4j1.2.17. Enhanced patternlayout is available from log41.2.16 ver
Edit log4j properties file
log4j.rootLogger = WARN, DB
log4j.appender.DB=abc.xyz.MyJdbcAppender
log4j.appender.DB.URL=jdbc:mysql://localhost/DBNAME
log4j.appender.DB.driver=com.mysql.jdbc.Driver
log4j.appender.DB.user=user_name
log4j.appender.DB.password=password
log4j.appender.DB.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.DB.conversionPattern=Insert into MylogFile(logid,loglevel,logcriteria,message,stacktrace,date) values (mysequence.nextval,’%p’,’%c’,
‘%m’,’%throwable{40},’%d{ABSOLUTE}’)
Now create a new class that will extend JDBCappender and overwrite getLogStatement():
Public MyJdbcAppender extends JDBCAppender{
protected String getLogStatement(LoggingEvent event) {
if(null!=event.getThrowableInformation() && event.getThrowableInformation().getThrowable() instance of SQLException){
SQLException myexce= new SQLException(event.
getThrowableInformation().getThrowable().getMessage().
replaceAll(“’”,” “),event.getThrowableInformation().getThrowable());
LoggingEvent clone = new LoggingEvent(
event.fqnOfCategoryClass,
LogManager.getLogger(event.getLoggerName()),
event.getLevel(),
event.getLevel(),event.getMessage(),myexce);
return getLayout().format(clone);
}
return getLayout().format(event)
}
}