微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在不更改%C的情况下将org.apache.log4j.Logger子类化?

如何解决在不更改%C的情况下将org.apache.log4j.Logger子类化?

| 为了启用诸如
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 \”继续打印原始的类名?     

解决方法

我做了类似的事情,但是最终创建了一个包装器并将类名传递给它。然后使用这个类名,将其放在我已经包装的所有4个日志记录级别的前面。这很混乱,但是我找不到另一种方法。我的日志记录语句现在吐出了记录器名称,然后是程序包/类名称。它有点麻烦,但是我宁愿拥有额外的信息,也不愿拥有足够的信息。     ,解决方案非常简单:添加完全限定的类名(FQCN),即:
static String FQCN = FormatLogger.class.getName() + \".\";
然后必须像这样修改log(..)方法:
super.log(FQCN,level,String.format(formatter,args),null);
log4j附带的示例MyLogger.java完美显示了这一点。 -1为我自己的懒惰!     ,删除FQCN字符串末尾的\“。\”,以使用Log4J 1.2.16版本或更高版本正确记录。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。