Log4j JDBCAppender to log stacktraces

前端 未结 4 1671
醉酒成梦
醉酒成梦 2021-01-06 23:52

Using org.apache.log4j.jdbc.JDBCAppender, how can I get stracktraces logged with warn and error into the PatternLayout.

4条回答
  •  爱一瞬间的悲伤
    2021-01-07 00:08

    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
    

提交回复
热议问题