这是我的示例代码:
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);
有人可以告诉我他们的不同之处,所以我知道应该使用哪个?
提前谢谢!
答案 0 :(得分:1)
匿名记录器没有名称,这意味着您无法将记录器名称用作formatter pattern。匿名记录器不执行安全检查,这意味着任何代码都可以更改匿名记录器的设置。
全局记录器只是System.out
所以可以说是日志记录API。它是一个命名记录器,如果代码试图修改设置,它会执行安全检查。
文档建议您尽可能使用named loggers。
来自GLOBAL_LOGGER_NAME文档:
"全球"提供Logger对象是为了方便开发人员随意使用Logging包。正在认真使用日志包(例如在产品中)的开发人员应该创建和使用他们自己的Logger对象,并使用适当的名称,以便可以在适当的每Logger粒度上控制日志记录。开发人员还需要对其Logger对象进行强有力的引用,以防止它们被垃圾回收。
创建一个匿名记录器。新创建的Logger未在LogManager名称空间中注册。对记录器的更新不会进行访问检查。
此工厂方法主要用于applet。由于生成的Logger是匿名的,因此可以通过创建类保持私有。这消除了对正常安全检查的需要,这反过来又允许不受信任的applet代码更新Logger的控制状态。例如,applet可以在匿名Logger上执行setLevel或addHandler。
即使新的记录器是匿名的,它也被配置为将根记录器("")作为其父记录器。这意味着默认情况下它会从根记录器继承其有效级别和处理程序。通过setParent方法更改其父级仍将需要该方法指定的安全权限。
此外,如果要保留示例类,请确保通过创建静态最终字段来保留对全局记录器的强引用。