Logger.getGlobal()和Logger.getAnonymousLogger()之间的区别?

时间:2017-10-23 11:24:40

标签: java logging java.util.logging

这是我的示例代码:

public class Logs {
    private static Logs logHandler;

    public static Logs handler() {
        if (null == logHandler) {
            logHandler = new Logs();
        }
        return logHandler;
    }

    public void logError(String message) {
        Logger.getGlobal().log(Level.SEVERE, message);
    }
}

我真的不明白这两者之间的区别,因为它们给出了完全相同的输出:

Logger.getGlobal.log(Level.SEVERE, message);

Logger.getAnonymousLogger.log(Level.SEVERE, message);

有人可以告诉我他们的不同之处,所以我知道应该使用哪个?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

匿名记录器没有名称,这意味着您无法将记录器名称用作formatter pattern。匿名记录器不执行安全检查,这意味着任何代码都可以更改匿名记录器的设置。

全局记录器只是System.out所以可以说是日志记录API。它是一个命名记录器,如果代码试图修改设置,它会执行安全检查。

文档建议您尽可能使用named loggers

来自GLOBAL_LOGGER_NAME文档:

  

"全球"提供Logger对象是为了方便开发人员随意使用Logging包。正在认真使用日志包(例如在产品中)的开发人员应该创建和使用他们自己的Logger对象,并使用适当的名称,以便可以在适当的每Logger粒度上控制日志记录。开发人员还需要对其Logger对象进行强有力的引用,以防止它们被垃圾回收。

来自getAnonymousLogger​()文档:

  

创建一个匿名记录器。新创建的Logger未在LogManager名称空间中注册。对记录器的更新不会进行访问检查。

     

此工厂方法主要用于applet。由于生成的Logger是匿名的,因此可以通过创建类保持私有。这消除了对正常安全检查的需要,这反过来又允许不受信任的applet代码更新Logger的控制状态。例如,applet可以在匿名Logger上执行setLevel或addHandler。

     

即使新的记录器是匿名的,它也被配置为将根记录器("")作为其父记录器。这意味着默认情况下它会从根记录器继承其有效级别和处理程序。通过setParent方法更改其父级仍将需要该方法指定的安全权限。

此外,如果要保留示例类,请确保通过创建静态最终字段来保留对全局记录器的强引用。