如何将java.util.logging.Logger覆盖到我的私有记录器?

时间:2013-05-21 12:05:01

标签: java logging

我从jar获取了使用java.util.logging.Logger

的代码

Jar包含大约1000个记录器用法,每个类从以下开始:

private static final Logger LOG = Logger.getLogger(SomeClass.class.getName());

我想处理那里的所有日志,意味着将它们指向我的Logger使用情况,而不是java.util.logging.Logger

因此我写了自己的记录器。

所以相反:

LOG.log(Level.SEVERE, "Error sleeping", e);

我可以写:

 MyLogger.toLog(TLogLevel.WFS_ERROR, "Monkey", "Error sleeping", e );

问题是我需要遍历所有java文件并替换为我的。

凌乱的方式,嗯

有没有人知道如何通过简单的方法将java.util.logging.Logger转换为com.boo.MyLogger

谢谢,

3 个答案:

答案 0 :(得分:6)

SLF4J项目有a jul-to-slf4j bridge,可用于将java.util.logging.Logger调用重定向到SLF4J。您可以使用它(通过使您的MyLogger实现SLF4J定义的接口)。

但是,请注意,与所有其他日志记录库不同,j.u.l。已经硬连接到Java类库中,并且在没有性能损失的情况下无法桥接。

另外,我不知道你在使用MyLogger做什么,但通常不需要自己编写。有很多日志记录实现可供选择,它们可以通过多种不同方式进行配置。即使您必须编写自己的Logger 实现,也应该使用现有的接口(例如SLF4J,这些日子似乎最受欢迎)。

答案 1 :(得分:2)

看看SLF4J

  

简单日志外观Java或(SLF4J)就像一个简单的   各种日志框架的外观或抽象,例如,   java.util.logging,log4j和logback,允许最终用户插入   部署时所需的日志框架。

然后,您可以使用logback(同一作者)使用已有的各种网桥登录到通用日志框架。或者,编写自己的,但无论哪种方式,您都不必担心替换所有代码......

答案 2 :(得分:2)

Oracle的Java 7 Logger是可配置的,它的实现很简单:

public static Logger getLogger(String name) {
    // This method is intentionally not a wrapper around a call
    // to getLogger(name, resourceBundleName). If it were then
    // this sequence:
    //
    //     getLogger("Foo", "resourceBundleForFoo");
    //     getLogger("Foo");
    //
    // would throw an IllegalArgumentException in the second call
    // because the wrapper would result in an attempt to replace
    // the existing "resourceBundleForFoo" with null.
    LogManager manager = LogManager.getLogManager();
    return manager.demandLogger(name);
}

所以你也可以通过代码设置一个日志级别;除了陈述性。

LogManager.getLogManager().getLogger(Logger.GLOBAL_LOGGER_NAME).setLevel(Level.INFO);

Lars Vogel有一个很好的页面,也有自己的Logger类。

所有放在一起是非常可行的,但有时可能有点难以理解。