Создание подкласса org.apache.log4j.Logger без изменения% C? - PullRequest
6 голосов
/ 26 мая 2011

Чтобы включить такие вещи, как

logger.info("This is a formatted number: %.2f", number)

Я решил написать подкласс org.apache.log4j.Logger. Я знаю, что мог бы написать класс-обертку для достижения того же результата, но так как я добавляю много дополнений в регистратор во время выполнения, я предпочитаю использовать наследование.

Подкласс выглядит следующим образом:

public final class FormatLogger extends Logger {

private final static FormatLoggerFactory factory = new FormatLoggerFactory();

protected FormatLogger(String name) {
    super(name);
}

public static Logger getLogger(String name) {
    return Logger.getLogger(name, factory);
}

public void fatal(String formatter, Object... args)  {
    log(Level.FATAL, formatter, args);
}

public void log(Level level, String formatter, Object... args) {
    if (super.isEnabledFor(level)) {
        super.log(level, String.format(formatter, args));
    }
}
}

Все работает хорошо - все, кроме одного: в текст сообщения теперь добавляется имя подкласса логгера, а не имя класса, вызывающего логгер. В качестве макета шаблона я использую следующий формат:

[%d{yyyyMMdd HHmmss}] %-5p [%t] %C: %m%n

т.е. все выглядит так:

[20110525 214515] INFO  [main] org.xyz.FormatLogger: This is a formatted number: 23.23

вместо:

[20110525 214515] INFO  [main] org.xyz.Main: This is a formatted number: 23.23

Есть ли способ сделать это "правильно", чтобы "% C" продолжал печатать оригинальное имя класса?

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Решение довольно простое: добавьте полное имя класса (FQCN), то есть:

static String FQCN = FormatLogger.class.getName() + ".";

Затем необходимо изменить метод log (..) следующим образом:

super.log(FQCN, level, String.format(formatter, args), null);

Это прекрасно показано в примере MyLogger.java, который поставляется с log4j.-1 за мою собственную лень!

1 голос
/ 03 января 2013

Удалить "."в конце строки FQCN, чтобы правильно войти в систему с Log4J версии 1.2.16 или более поздней.

1 голос
/ 26 мая 2011

Я сделал нечто подобное, но в итоге я создал оболочку и передал ей имя класса. Затем с этим именем класса я добавила его перед всеми 4 уровнями журналирования, которые я все равно уже оборачивала. Это довольно грязно, но я не мог найти другой способ сделать это. Мои операторы журналирования теперь выдают имя регистратора, а затем имя пакета / класса. Это немного громоздко, но я бы предпочел иметь дополнительную информацию, а не иметь достаточно информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...