# SLF4j 与 log4j 的比较

**URL:** <https://www.isharkfly.com/t/slf4j-log4j/7081>\
**Category:** 程序语言\
**Created:** [November 11, 2014, 6:20pm UTC](https://www.isharkfly.com/t/slf4j-log4j/7081 "2014-11-11T18:20:14Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [November 11, 2014, 6:20pm UTC](https://www.isharkfly.com/t/slf4j-log4j/7081/1 "2014-11-11T18:20:14Z")

</div>

log4j 提供 TRACE, DEBUG, INFO, WARN, ERROR 及 FATAL 六种纪录等级，但是 SLF4J 认为 ERROR 与 FATAL 并没有实质上的差别，所以拿掉了 FATAL 等级，只剩下其他五种。

大部分人在程序里面会去写logger.error(exception),其实这个时候log4j回去把这个exception tostring。真正的写法应该是logger(message.exception);而slf4j就不会使得程序员犯这个错误。

log4j间接的在鼓励程序员使用string相加的写法，而slf4j就不会有这个问题 ,你可以使用logger.error(“{} is+serviceid”,serviceid);

使用slf4j可以方便的使用其提供的各种集体的实现的jar。（类似commons-logger）

从commons–logger和log4j merge非常方便，slf4j也提供了一个swing的tools来帮助大家完成这个merge。

提供字串内容替换的功能，会比较有效率，说明如下：[code]// 传统的字符串产生方式，如果没有要记录Debug等级的信息，就会浪费时间在产生不必要的信息上  
logger.debug("There are now " + count + " user accounts: " + userAccountList);

// 为了避免上述问题，我们可以先检查是不是开启了Debug信息记录功能，只是程序的编码会比较复杂  
if (logger.isDebugEnabled()) {  
logger.debug("There are now " + count + " user accounts: " + userAccountList);  
}

// 如果Debug等级没有开启，则不会产生不必要的字符串，同时也能保持程序编码的简洁  
logger.debug(“There are now {} user accounts: {}”, count, userAccountList);  
[/code]SLF4J 只支持 MDC，不支持 NDC。
