【发布时间】:2016-02-01 12:23:14
【问题描述】:
我有以下问题:我想使用java.util.logging.Logger。不,我找到了不同的资源1,2,3,如何修改记录器的行为。
特别是在2 的问题中,一个(在我看来)根据类名初始化记录器的结构很好。如果需要,这还允许在基于包的级别上修改详细程度以进行调试。
在深入研究问题后,我发现全局记录器和“空”记录器(名称为"")并不相同。另请参见下面的示例。
我刚刚创建了一个记录器foo.Bar,它锚定在空记录器而不是名为foo 的记录器上。
仅当我首先创建记录器bar 时,记录器bar.Baz 才会正确锚定到它。
这使得this question 中的方法主要是无用的,因为不能假设之前创建了父记录器。据我所知,必须解析类名并根据需要创建记录器。
在初始化自己的记录器之前,我必须添加一些static {...} 代码以递归方式初始化记录器,这对吗?
如果多个类为包记录器调用Logger.getLogger(String) 方法,这是否有任何负面影响(导致整体多次调用,例如bar.Baz 和bar.FooBaz 都获取记录器bar)?
import java.util.Enumeration;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class TestLogger
{
public static void main(String[] args)
{
// Create the logger directly
Logger.getLogger("foo.Bar");
// Create the logger objects step-by-step
Logger.getLogger("bar");
Logger.getLogger("bar.Baz");
// Put the available loggers to output
Enumeration<String> e = LogManager.getLogManager().getLoggerNames();
while(e.hasMoreElements())
{
String s = e.nextElement();
Logger l = Logger.getLogger(s);
String p = (l.getParent() == null ? "none" : "'" + l.getParent().getName() + "'");
System.out.println("'" + s + "': " + p);
}
}
}
程序的输出是
'bar': ''
'global': ''
'foo.bar': ''
'bar.baz': 'bar'
'': none
【问题讨论】:
-
java.utils.Loggers 可能很棘手。虽然我不完全理解这里的实际问题是什么,但(可能)重要的旁注:记录器可以被垃圾收集。当您在main方法中写入Logger.getLogger("foo").setLevel(x),然后在其他地方获得带有Logger.getLogger("foo")的记录器时,它可能是一个不同的实例!您在main中获取的记录器可能已经被垃圾回收,第二次getLogger("foo")调用将创建一个新实例。
标签: java logging java.util.logging