2015-05-10 3 views
1

У меня есть простой образец log4j:log4j JDBCAppender java.lang.ClassCastException

Test.java:

package com.mobin.pack1; 

import org.apache.log4j.Logger; 

public class Test { 
    final static Logger logger = Logger.getLogger(Test.class); 

    public static void main(String[] args) { 
     try { 
     int x = 0; 
      int y = 5; 
      int z = y/x; 

      System.out.println(z); 

     } catch (Exception e) { 
      logger.error("error" , e); 
     }  
    } 
} 

log4j.properties:

log4j.rootLogger = DEBUG, DB 
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender 
log4j.appender.DB.URL=jdbc:mysql://localhost/logDB 
log4j.appender.DB.driver=com.mysql.jdbc.Driver 
log4j.appender.DB.user=root 
log4j.appender.DB.password=123 
log4j.appender.DB.sql=INSERT INTO TestLOGS(DATE,LOGGER,LEVEL,MESSAGE,THROWABLE) VALUES('%d{yyyy-MM-dd HH:mm:ss}','%C:%L','%p','%m','%throwable{100}') 
log4j.appender.DB.layout=org.apache.log4j.EnhancedPatternLayout 

зависимость:

<dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.17</version> 
</dependency> 

TestLOGS таблица:

CREATE TABLE IF NOT EXISTS `TestLOGS` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `DATE` varchar(20) COLLATE utf8_bin NOT NULL, 
    `LOGGER` varchar(100) COLLATE utf8_bin NOT NULL, 
    `LEVEL` varchar(10) COLLATE utf8_bin NOT NULL, 
    `MESSAGE` varchar(1000) COLLATE utf8_bin NOT NULL, 
    `THROWABLE` varchar(1000) COLLATE utf8_bin DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2 ; 

, когда я запускаю его я получаю это исключение:

log4j:WARN Failed to set property [sql] to value "INSERT INTO TestLOGS(DATE,LOGGER,LEVEL,MESSAGE,THROWABLE) VALUES('%d{yyyy-MM-dd HH:mm:ss}','%C:%L','%p','%m','%throwable{100}')". 
java.lang.reflect.InvocationTargetException 
. 
. 
. 
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) 
. 
. 
. 
log4j:ERROR Failed to excute sql 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'error' at line 1 

но когда я изменить "org.apache.log4j.EnhancedPatternLayout", чтобы org.apache.log4j.PatternLayout в log4j.properties я не 't получить эти исключения, но в столбце THROWABLE таблицы вставлено значение "mainhrowable {100}".

что это проблема?

+0

возможно дубликат: http://stackoverflow.com/questions/6734044/log4j-jdbcappender-to-log-stacktraces – daphshez

+0

Я написал этот образец от этой должности. но моя проблема - это что-то еще, что объясняет в моем посте. – hossein

+0

Это сообщение предложило добавить зависимость, которую я не думаю, что вы добавили, apache-log4j-extras – daphshez

ответ

0

Если вы видите code из org.apache.log4j.jdbc.JDBCAppender, вы можете заметить в методе setSql, что требуется экземпляр org.apache.log4j.PatternLayout. Таким образом, вы получите правильно.

В принципе, у вас есть два варианта:

  • изменить ваш SQL заявление и использовать org.apache.log4j.PatternLayout.
  • Расширить класс org.apache.log4j.jdbc.JDBCAppender и переопределить метод setSql. Добавьте его в свою конфигурацию.
Смежные вопросы