Можно ли поставить префикс каждой строки трассировки стека в log4j? - PullRequest
6 голосов
/ 11 августа 2010

когда вы пишете

logger.error("message", exception);

log4j создает сообщение и трассировку полного стека:

Aug  9 06:26:13 10.175.60.14 myPrefix: [error] [TP-Processor114] [my.class.Name] message : exception
at fatherOfException
at fatherof_fatherOfException
at fatherof_fatherof_fatherOfException
...

мой шаблон преобразования

log4j.appender.syslog.layout.ConversionPattern=myPrefix: [%p] [%t] [%c] [%x] - %m%n

Итак,возможно префикс каждой строки с помощью myPrefix, например:

    Aug  9 06:26:13 10.175.60.14 myPrefix: [error] [TP-Processor114] [my.class.Name] message : exception
myPrefix    at fatherOfException
myPrefix    at fatherof_fatherOfException
myPrefix    at fatherof_fatherof_fatherOfException
    ...

Когда я выполняю поиск в журналах myPrefix, я не вижу трассировки стека.У нас много разных префиксов (по одному на модуль)

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 01 октября 2010

См. Ответ Алекса как более чистый.

Вы можете написать собственную реализацию org.apache.log4j.spi.ThrowableRenderer:

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/spi/ThrowableRenderer.html

Затем отредактируйте свою конфигурацию log4j:

log4j.throwableRenderer = your-custom-class-name

ThrowableRenderer возвращает массив String с.Вот ваш код:

String prefix = "myPrefix"; // Or some constant

List<String> l = new LinkedList<String>();
l.add(String.format("%s %s: %s", prefix, t.getClass().getName(), t.getMessage()));

for (StackTraceElement ste: t.getStackTrace()){
    l.add(String.format("%s %s", prefix, ste.toString()));
}

return (String[]) l.toArray();

Другая идея заключается в том, чтобы напечатать Throwable в PrintWriter, который оборачивает некоторую Writer, которая записывает в память, и затем повторять строки, ограниченные line.separator, добавляя каждую строку в список:

StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));

List<String> l = new LinkedList<String>();
for (String s: sw.toString().split(System.lineSeparator())) {
    l.add(String.format("%s %s", prefix, s));
}

return (String[]) l.toArray();
2 голосов
/ 30 апреля 2015

Подкласс ThrowableRenderer, например:

import org.apache.log4j.DefaultThrowableRenderer;
import org.apache.log4j.spi.ThrowableRenderer;

public class LogThrowableRenderer implements ThrowableRenderer {

    DefaultThrowableRenderer def = new DefaultThrowableRenderer();

    @Override
    public String[] doRender(Throwable t) {
        String[] temp = def.doRender(t);
        for (int i = 0; i < temp.length; i++) {
            temp[i] = "myPrefix "+temp[i];
        }
        return temp;
    }

}

Добавить к вашему log4j.properties:

log4j.throwableRenderer=whatever.package.LogThrowableRenderer

При этом используется существующий DefaultThrowableRenderer для визуализации стековой трассировки привычным образом перед добавлением префикса, поэтому он будет включать класс Throwable, сообщение и причину.

0 голосов
/ 11 августа 2010

Напишите функцию-обертку, чтобы сделать это для вас.

private void writeToLogs(String message, Exception excp) {
    logger.error("myPrefix\t" + message, excp);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...