Log4j与框架集成打印日志数量爆炸及性能问题

平时使用Log4j的时候总是会打印很多日志但是其中一些部分又不想忽略

0x01 打印日志数量爆炸问题

log4j.rootLogger=DEBUG, CONSOLE, FILE
当把rootLogger日志级别设置成DEBUG的时候,会把Hibernate、Spring等各种框架的debug日志打印下来,在控制台和文件中看得我简直爆炸。

enter image description here

而我只想要在控制台和LogFile中打印我自己的DEBUG信息

解决方案:
将hibernate及spring日志级别设置成WARN

1
2
3
## close the spring,hibernate info 
log4j.category.org.springframework=WARN
log4j.category.org.hibernate=WARN

从此控制台和日志文件就清静了。
enter image description here

0x02 Log4j Debug性能问题

1
LOGGER.debug(str)

若直接打印debug,尽管LOGGER.debug源码中有repository.isDisabled(Level.DEBUG_INT)
判断日志等级,日志等级设置的是WARN、ERROR等高于DEBUG的权限,里面的message也会被构建,影响性能!
(slf4j中debug的源码中自带有if(this.logger.isDebugEnabled()))

改良后则是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstract class BaseController {
//logger
protected final Logger LOGGER = Logger.getLogger(getClass());

//判断是否开启了Debug模式!就算设置的不是debug模式,里面的message也会构建
private final Boolean isDebugEnable = LOGGER.isDebugEnabled();

//通用DEBUG语句,增加判断
public final void debug(Object message){
if(isDebugEnable) {
LOGGER.debug(s);
}
}
}