对于一个系统来说日志是必不可少的一部分,线上问题跟踪,基于日志的业务逻辑统计分析等都离不日志。记得16年一个leader就对我说过,一个牛逼的程序员排查问题不是去debug,而是去看日志文件,至今记忆犹新。曾经因启动项目总是因为日志jar包冲突的原因,一个牛逼的架构师也分享过日志框架相关内容。一直有将此内容总结形成博客的想法,今日终于落地。
日志体系大致为上图所示,我们的系统会直接与接口层交互。当然也可以直接使用具体的日志实现,比如logback,但是按照面向接口编程的理念,建议不要在系统中直接使用具体日志系统的代码,否则后续若要更换日志系统,会相当麻烦。
org.slf4j
slf4j-api
${org.slf4j-version}
package com.jd.pop.base.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author David
*/
public class Slf4jTestLog {
static Logger log = LoggerFactory.getLogger(Slf4jTestLog.class);
public static void main(String[] args) {
log.info("Slf4jTestLog.main-req:{}", 123);
System.out.println("这是普通日志");
System.err.println("这是错误日志");
log.info("Slf4jTestLog.run-req1:{}", Thread.currentThread().getId());
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
public void run() {
log.info("Slf4jTestLog.run-req:{}", Thread.currentThread().getId());
}
}).start();
}
}
}
org.slf4j
slf4j-api
${org.slf4j-version}
ch.qos.logback
logback-classic
${logback-version}
org.slf4j
slf4j-api
${org.slf4j-version}
log4j
log4j
${log4j-version}
slf4j-log4j12
org.slf4j
${org.slf4j-version}
org.slf4j
slf4j-api
${org.slf4j-version}
org.slf4j
slf4j-jdk14
${logjdk-version}
org.slf4j
slf4j-api
${org.slf4j-version}
slf4j-simple
org.slf4j
${simple-version}
org.slf4j
slf4j-api
${org.slf4j-version}
slf4j-nop
org.slf4j
${nop-version}
commons-logging
commons-logging
${logcom-version}
package com.jd.pop.base.log;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author David
*/
public class ComTestLog {
static Log log = LogFactory.getLog(ComTestLog.class);
public static void main(String[] args) {
log.info("Slf4jTestLog.main-req:" + 123);
System.out.println("这是普通日志");
System.err.println("这是错误日志");
log.warn("Slf4jTestLog.run-req1:" + Thread.currentThread().getId());
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
public void run() {
log.info("Slf4jTestLog.run-req:" + Thread.currentThread().getId());
}
}).start();
}
}
}
commons-logging
commons-logging
${logcom-version}
log4j
log4j
${log4j-version}
org.slf4j
jcl-over-slf4j
${org.slf4j-version}
org.slf4j
slf4j-jdk14
${logjdk-version}
package com.jd.pop.base.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author David
*/
public class Slf4jTestLog {
static Logger log = LoggerFactory.getLogger(Slf4jTestLog.class);
public static void main(String[] args) {
log.info("Slf4jTestLog.main-req:{}", 123);
System.out.println("这是普通日志");
System.err.println("这是错误日志");
log.info("Slf4jTestLog.run-req1:{}", Thread.currentThread().getId());
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
public void run() {
log.info("Slf4jTestLog.run-req:{}", Thread.currentThread().getId());
}
}).start();
}
}
}
1、pom加入jar包
log4j
log4j
${log4j-version}
slf4j-log4j12
org.slf4j
${org.slf4j-version}
org.slf4j
log4j-over-slf4j
${org.slf4j-version}
如果系统中用的是门面日志,参考桥接的使用方式;否则参考重定向的使用方式,先转到slf4j,再通过别的日志实现。
经过多年的发展Slf4j+Logback与组合,Commons Logging与Log4j组合两大阵营已经基本成为了Java项目开发的标准,建议在新的项目开发中从这两种方案中选择适合自己项目的组合方案。源码的角度解读后面博客更新,敬请期待!