在不改变%C的情况下对org.apache.log4j.Logger进行子类化?

时间:2011-05-25 20:11:50

标签: java log4j

启用

之类的内容
logger.info("This is a formatted number: %.2f", number)

我决定写一个org.apache.log4j.Logger的子类。我知道,我本可以编写一个包装类来实现相同的结果但是因为我在运行时向记录器中添加了很多appender,所以我更喜欢使用继承。

子类看起来像这样:

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 个答案:

答案 0 :(得分:1)

我做了类似的事情,但我最终创建了一个包装器并将类名传递给它。然后使用这个类名,我将它添加到所有4个日志记录级别的前面,无论如何我已经将它包装好了。它很乱,但我找不到另一种方法。我的日志记录语句现在吐出记录器名称,然后是包/类名。它有点麻烦,但我宁愿有额外的信息与没有足够的信息。

答案 1 :(得分:1)

解决方案很简单:添加一个完全限定的类名(FQCN),即:

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

然后必须修改log(..)方法:

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

这完全显示在log4j附带的示例MyLogger.java中。 -1为我自己的懒惰!

答案 2 :(得分:1)

删除“。”在FQCN字符串的末尾,使用Log4J 1.2.16或更高版本正确登录。