Как распечатать трассировки стека в отдельных строках после перехвата исключения в Log4J

В настоящее время я могу получить трассировку стека:

final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw, true);
throwable.printStackTrace(pw);
String stackTraceAsString = sw.getBuffer().toString();

но при вызове функций журнала, таких как errors (), debug () и т. д., я мог получить все трассировки стека только в одной строке, хотя строка трассировки стека содержит \r\n. Хочу разделить его на несколько строк.

Изучая класс Appender:

@Override
protected void subAppend(LoggingEvent event) {
    this.qw.write(this.layout.format(event));

    if (this.layout.ignoresThrowable()) {
        String[] s = event.getThrowableStrRep();
        if (s != null) {
            int len = s.length;
            for (int i = 0; i < len; i++) {
                this.qw.write(s[i]);
                this.qw.write(Layout.LINE_SEP);
            }
        }
    }
    if (this.immediateFlush) {
        this.qw.flush();
    }
}

Тем не менее, он имеет дело только с исключением, которое было выброшено, но не было перехвачено. Поэтому я реализую настраиваемый аппендер:

public class CustomRollingFileAppender extends RollingFileAppender {
}

Я пытаюсь извлечь строку из переменной QuiteWriter внутри этого класса, заменить ее '\ r \ n' на Layout.LINE_SEP, но я не знаю, как ее извлечь.


person Duc Tran    schedule 29.07.2015    source источник
comment
Почему вы конвертируете трассировку стека в String? Log4J сам регистрирует трассировку стека, если вы передаете объект exception. Обратитесь к api error. Также, вероятно, проверьте этот вопрос http://stackoverflow.com/questions/1806378/log4j-not-adding-newlines-between-logfile-entries   -  person Utkarsh    schedule 29.07.2015
comment
Ага. ты прав. Я забыл использовать этот метод с 3 параметрами. Большое спасибо.   -  person Duc Tran    schedule 29.07.2015


Ответы (1)


Короче говоря, нет, нет способа переопределить постоянную переменную интерфейса (Layout.LINE_SEP - это постоянная переменная, определенная в)

Кроме того, вы не переопределяете переменные класса в Java, вы их скрываете. Переопределение - это, например, методы. Скрытие отличается от переопределения.

Поскольку для Layout.LINE_SEP нет доступных методов получения или установки, мы также не можем переопределить.

Что касается вашего вопроса, вам не нужно печатать трассировку стека в String, а затем регистрировать ее. LOG4J предоставляет методы, которые будут печатать трассировку стека для вас.

Например.

public void log(Priority priority, Object message, Throwable t)

public void error(Object message, Throwable t)

Передача объекта exception в переменную t типа throwable распечатает трассировку стека вместе с разрывами строк.

person Utkarsh    schedule 29.07.2015
comment
ты прав. Однако я не имел в виду переопределить постоянную переменную интерфейса - person Duc Tran; 01.08.2015