sl4j或者log4j中,推薦的記錄方式是:
private Logger log = Logger.getLogger(getClass());
//或者
private static final Logger log = Logger.getLogger(XXX.class);
//調用
log.debug();
log.info();
然后很多人就覺得不爽了,這特么這里聲明一個log變量,那里聲明一個log變量,多傻呀,於是就產生了下面的記錄方式:
LogHelper.debug();//或者LogUtil.debug()
LogHelper.info();
在這里,我不是針對誰,這么用的人,根本沒有掌握log4x的意義所在!!!
日志記錄解決方案#
階段一##
最開始,是Console.Write,打印到控制台,看看內容是什么
階段二##
console有兩個弊端:
1)影響正常的輸出——生產版本需要將這些打印代碼去掉;
2)需要看的時候又一下刷過去了
於是變成文件記錄
階段三##
發現有些信息放在一起,總是從一大段無用的信息中去查找一些信息,於是產生了日志級別,根據不同的級別,記錄到不同的地方
發現了Trace, Debug,Info, Warn, Error等級別。
階段四##
發現調試信息特別多,記錄起來沒什么意義,要輸出還影響程序性能。
但是有些問題,只能在生產環境下重現問題。
於是一種可以靈活控制日志輸出的解決方案——log4x出現了。
log4x的用法#
可能很多人的用法僅限於,設置一個root的log配置
<root level="INFO">
<appender-ref ref="console" />
<appender-ref ref="rollingFile" />
</root>
但實際上,還有如下的方式
<logger name="com.abc.www.LogTest" level="DEBUG" />
<logger name="com.abc.www" level="DEBUG" />
<logger name="com.abc" level="DEBUG" />
當有如下logger的實例時
package com.abc.www;
public class LogTest{
private Logger log = LoggerFactory.getLogger(getClass());
}
會優先尋找最匹配的logger配置
如果找到 name="com.abc.www.LogTest"
的logger配置,則使用該配置,否則往上找 name="com.abc.www"
的logger配置,一直到最終root配置。
這才是log4x的最好用的地方!!!
所以,下面這種用法是不是有問題?
//LogHelper中
private static Logger log = LoggerFactory.getLogger("myLogger");
//使用
LogHelper.debug();
LogHelper.info();
其它#
以前我也疑惑log4j的用法,為什么要這么用,為什么要定義這么多log變量。
希望看到這篇文章的朋友,不再疑惑。
微信,加好友,不用付款