2011-07-18 1 views
2

Использование org.apache.log4j.jdbc.JDBCAppender, как я могу получить stracktraces, зарегистрированный с warn и error в PatternLayout.Log4j JDBCAppender loglogtraces

Я вход как

logger.warn("warning description", e); 
logger.error("error description", e); 

Я получаю описание строк в таблицу, но StackTrace в метательном сейчас находится где. Есть ли еще один параметр, который я могу получить через PatternLayout. В настоящее время я использую

"INSERT INTO app_logs (app, log_date, log_level, location, loc, message) VALUES ('my-apps-name', '%d{ISO8601}','%p', '%C.java', '%C{1}.java:%L', '%m')" 

в таблицу

TABLE `app_logs` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `app` varchar(255) DEFAULT NULL, 
    `log_date` varchar(255) DEFAULT NULL, 
    `log_level` varchar(255) DEFAULT NULL, 
    `location` varchar(255) DEFAULT NULL, 
    `loc` varchar(255) DEFAULT NULL, 
    `message` text, 
    PRIMARY KEY (`id`) 
) 

ответ

11

Я нашел решение.

Заменить класс PatternLayout классом EnhancedPatternLayout.

org.apache.log4j.EnhancedPatternLayout

Вы также должны включать apache-log4j-extra dependency

Или include it in your pom:

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>apache-log4j-extras</artifactId> 
    <version>1.1</version> 
</dependency> 

Теперь у вас есть доступ к% метательного

%throwable{short} или %throwable{1} выход будет f первая строка стека след. throwable{none} или throwable{0} будет подавлять трассировку стека. %throwable{n} выводит n строк трассировки стека, если положительное целое число или опустить последние строки -n, если отрицательное целое число.

Я добавил к моему столу,

TABLE `app_logs` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `app` varchar(255) DEFAULT NULL, 
    `log_date` varchar(255) DEFAULT NULL, 
    `log_level` varchar(255) DEFAULT NULL, 
    `location` varchar(255) DEFAULT NULL, 
    `loc` varchar(255) DEFAULT NULL, 
    `message` text, 
    `throwable` text, 
    `stacktrace` text, 
    PRIMARY KEY (`id`) 
) 

И обновил свой шаблон для заполнения этих столбцов.

"INSERT INTO app_logs (app, log_date, log_level, location, loc, message, throwable, stacktrace) VALUES ('my-apps-name', '%d{ISO8601}','%p', '%C.java', '%C{1}.java:%L', '%m', '%throwable{short}', '%throwable{100}')" 
+0

Это решение работает нормально, но трассировки стека может иметь запятые или одиночные кавычки, и мы должны дезинфицировать данные, для которых вы должны переопределить функцию getLogStatement, как показано Sangeet Kumar здесь, в одном из его ответов. – Gaurav

+0

Я знаю это старое сообщение. Хотел указать, что ссылка в ответе нарушена. Не могли бы вы обновить ссылку в интересах тех (как я), которые заинтересованы в этом решении. – Chiseled

+0

Должно быть исправлено. – MikeNereson

3

Решения есть мы должны использовать EnhancedPattern макет, с помощью этого мы можем войти всю трассировку стеки в БД. Но есть одна проблема, если мы используем это, если Stacktrace содержит запятую (,), сообщение не будет регистрироваться. Я решил это, написав getLogStatement(), которое доступно в JDBC appender Sourcecode

Следуйте ниже Этапы

  1. Скачать Log4j1.2.17. Усовершенствованный шаблонный выход доступен из log41.2.16 вер

  2. Редактирование свойств log4j файл

    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}’) 
    
  3. Теперь создадим новый класс, который будет распространяться JDBCappender и перезаписать 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) 
    } 
    } 
    
+0

Вам не нужно вставлять все это в теги кода. –

+0

@SangeetKumar вы также обнаружите, что вам нужно сбежать '' ' – MikeNereson

2

log4j 1.2.16+ «s 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.apa che.log4j.jdbc.JDBCAppender.setSql (JDBCAppender.java:330)



EDIT (после углубленного исследования):
Использование 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 
+0

Просто сказать, что если ваше решение работает на log4j 1.2.16, то на 1.2.17 оно не запускается ... – sixro

3

Чтобы продлить на ответ MikeNereson, вот является log4j.properties, которые работали:

log4j.rootLogger=DEBUG,DB 
log4j.appender.DB.driver=com.mysql.jdbc.Driver 
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender 
log4j.appender.DB.URL=jdbc:mysql://server/db 
log4j.appender.DB.user=user 
log4j.appender.DB.password=pwd 
log4j.appender.DB.layout.ConversionPattern=INSERT INTO app_logs (app, log_date, log_level, location, loc, message, throwable, stacktrace) VALUES ('appname', '%d{ISO8601}','%p', '%C.java', '%C{1}.java:%L', '%m', '%throwable{short}', '%throwable{100}') 
log4j.appender.DB.layout=org.apache.log4j.EnhancedPatternLayout 
log4j.category.ke.co=ERROR 
log4j.category.ke.co.appender-ref=DB 
+1

установка log4j.appender.DB. layout = org.apache.log4j.EnhancedPatternLayout создает ClassCastException org.apache.log4j.EnhancedPatternLayout не может быть передан в org.apache.log4j.PatternLayout – sixro

+1

проверить версию Log4j. Загрузить Log4j1.2.17 + – JStark

Смежные вопросы