Logger的Java文档指出记录器名称应该基于类名。Google Guice在BinderImpl.java中处理这个问题,它做了以下工作:
return member == null
? Logger.getAnonymousLogger()
: Logger.getLogger(member.getDeclaringClass().getName());
但是,因为它为每个类都有一个新的记录器,所以我将无法访问可能已经添加到记录器中的任何Handler's。
既要在记录器中使用类名又要应用一组标准处理程序,最好的方法是什么?
发布于 2010-01-15 15:24:48
该解决方案实际上与Guice无关,而是基于Java中日志记录类的工作方式。
记录器是在层次结构中创建的,因此,记录器x.y.z
是x.y
的子级,一直向上一直到根记录器,其名称是空字符串。每个记录器都从其父记录器继承属性,就像它的日志级别一样。
因此,为了全局设置日志级别(或全局设置处理程序),只需在根记录器上设置它们:
LogManager logManager = LogManager.getLogManager();
Logger rootLogger = logManager.getLogger("");
rootLogger.setLevel(Level.FINEST);
rootLogger.addHandler(new ConsoleHandler());
一旦完成此操作,任何注入的记录器都将从根记录器和任何可能存在的父记录器中派生其属性。有关基础知识的更多信息,请参阅LogManager documentation。
还存在config
属性。根据LogManager文档:
配置A属性“
”。此属性旨在允许运行任意配置代码。该属性定义一个以空格或逗号分隔的类名列表。将为每个命名类创建一个新实例。每个类的默认构造函数可以执行任意代码来更新日志配置,例如设置记录器级别、添加处理程序、添加过滤器等。
这意味着这个问题有多种解决方案,因为我也可以使用一个配置类。
https://stackoverflow.com/questions/2068487
复制