Чтобы включить такие вещи, как
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" продолжал печатать оригинальное имя класса?