记录器是否应声明为静态?通常我会看到两种类型的记录器声明:
protected Log log = new Log4JLogger(aClass.class);
要么
private static Log log = new Log4JLogger(aClass.class);
应该使用哪一个?这两者的专业和概念是什么?
Bal*_*usC 95
非静态表单的优点是您可以在(抽象)基类中声明它,如下所示,而不必担心将使用正确的类名:
protected Log log = new Log4JLogger(getClass());
Run Code Online (Sandbox Code Playgroud)
然而,它的缺点显然是将为该类的每个实例创建一个全新的记录器实例.这可能本身并不昂贵,但它增加了很大的开销.如果您想避免这种情况,您可以使用该static表单.但它的缺点反过来就是你必须在每个单独的类中声明它并在每个类中注意在记录器构造期间使用了正确的类名,因为getClass()不能在静态上下文中使用它.但是,在普通的IDE中,您可以为此创建自动完成模板.例如logger+ ctrl+space.
另一方面,如果您通过工厂获取记录器,而工厂又可以缓存已经实例化的记录器,那么使用非静态表单不会增加太多开销.例如,Log4j有一个LogManager用于此目的.
protected Log log = LogManager.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)
pie*_*era 44
我以前认为所有记录器都应该是静态的; 但是,wiki.apache.org上的这篇文章提出了一些关于类加载器泄漏的重要内存问题.将logger声明为static会阻止声明类(和关联的类加载器)在使用共享类加载器的J2EE容器中进行垃圾回收.如果您重新部署应用程序足够多次,这将导致PermGen错误.
除了将记录器声明为非静态外,我真的没有办法解决这个类加载器泄漏问题.
Wou*_*rts 15
最重要的区别是它如何影响您的日志文件:日志在哪个类别中?
你的第一个案例有一个变种:
protected Log log = new Log4JLogger(getClass());
在这种情况下,您的日志类别会说明记录的代码正在处理哪个对象.
在第二个选择(私有静态)中,日志类别是包含日志记录代码的类.通常是正在记录事物的类.
我强烈建议最后一个选项.与其他解决方案相比,它具有以下优势:
它也有缺点:
使用控制反转并将记录器传递给构造函数。如果您在类中创建记录器,您的单元测试将会有一段时间。您正在编写单元测试,不是吗?
| 归档时间: |
|
| 查看次数: |
38309 次 |
| 最近记录: |