标签:
最近看一些old fasion的代码,发现仅仅一个logger的声明,就很有意思。
以SLF为例,
首先是推荐的写法:
private final static Logger logger = LoggerFactory.getLogger(MyClass.class);
然后按词解读:
private :保持私有,不给外部类机会; final :保持不变,不给修改的机会; static :保持静态,节省开销;
至于
LoggerFactory.getLogger(MyClass.class);
我们能看到某些使用getClass() 替代的方法。
这里有些利弊:
getClass(): 不能使用static修饰,Java初始化顺序导致;
MyClass.class : 不能动态显示子类归属的log;
——————————————分割线——————————————
刚才跟同事讨论了一下,好像关于是否static有很大争议 ,各有各的好处。
然后,对于某些共享类,特别是没有自己log的module,怎么加log也很有意思。
看过之前的某个遗留代码,为了拿className费尽周折啊,不过这种有并发问题,权作拓展思路吧
public static void info(String msg) { if(useLog4j) { instance.log4jLogger=org.apache.log4j.Logger.getLogger(getClassName()); instance.log4jLogger.info(getMethodName() +" : "+msg); } else { instance.logger.logp(Level.INFO, getClassName(), getMethodName(), msg); } } private static String getClassName() { Throwable t = CusLogger.e.fillInStackTrace(); StackTraceElement elements[] = t.getStackTrace(); StackTraceElement element = elements[2]; return element.getClassName(); }
标签:
原文地址:http://my.oschina.net/u/921876/blog/423706