最近看一些old fasion的代碼,發現僅僅一個logger的聲明,就頗有意思。html
以SLF爲例,java
首先是推薦的寫法:apache
private final static Logger logger = LoggerFactory.getLogger(MyClass.class);
而後按詞解讀:併發
private :保持私有,不給外部類機會; final :保持不變,不給修改的機會; static :保持靜態,節省開銷;
至於
.net
LoggerFactory.getLogger(MyClass.class);
咱們能看到某些使用getClass() 替代的方法。code
這裏有些利弊:htm
getClass(): 不能使用static修飾,Java初始化順序致使;
blog
MyClass.class : 不能動態顯示子類歸屬的log;element
——————————————分割線——————————————
剛纔跟同事討論了一下,好像關因而否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(); }