由聲明logger談起

最近看一些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


Ref: 1   2  3  4get


——————————————分割線——————————————

剛纔跟同事討論了一下,好像關因而否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();
    }
相關文章
相關標籤/搜索