在QQ群中和诸多Java同行讨论得出以下结论:
我觉得日志用static修饰的思考策略应该是:
因为日志长期要用,而且,类的方法(不排除存在static方法)肯能被其他地方使用,
那么对于这类static方法,也是需要记录日志的,不能等new出来在记载,那么久漏掉这块日志了,所以,长期记录该类日志,要把logger做成static形式。
什么时候static无需修饰logger,就在于,该类没有static修饰的方法,另外,这个logger和普通成员变量还是有区别,普通成员变量比如String,创建比较简单快速,logger是创建了一系列类,logger占用内存比String变量大。所以,用static修饰,而普通变量不用static修饰。
频繁创建的相同的对象 用static 比如数据库连接字符串之类的 虽然对于较大的对象在初始化时需要时间 但是跑起来之后 就可以节约很多时间的 创建变量 分配内存 都需要时间 虽然很少 但是频率较高的话用static 会减少开支的 单例模式中可以看得出来 在初始化的第一次调用 或者直接程序启动的时候就创建 。
代码如下:
package com.rh.test;
import org.apache.log4j.Logger;
public class TestLogger {
public static final Logger loggerx = Logger.getLogger(TestLogger.class);
public static final Logger loggery = Logger.getLogger(TestLogger.class);
public static void main(String[] args) {
System.out.println(loggerx);
System.out.println(loggery);
}
}
这个测试代码,说明了,logger是多例的,一个类一个logger。
logger底层源码实现:
/**
* {@inheritDoc}
*/
public Logger getLogger(final String name) {
return new NOPLogger(this, name);
}
可以看出,logger是多例的。