求求别再这么用log4x了
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变量。
希望看到这篇文章的朋友,不再疑惑。
微信,加好友,不用付款