常用的日志组件
名称 jar 描述
-----------------------------------------------------------------------------------------
log4j log4j-1.2.17.jar 早期常用的日志组件
logback logback-core
logback-classic 一套日志组件的实现,性能优于log4j(slf4j阵营)
logback-access
log4j2 log4j
log4j-api apache开发的一款Log4j的升级产品
log4j-core
java.util.loging jdk java1.4以来的官方日志实现,无需第三方依赖
-----------------------------------------------------------------------------------------
两种日志门面,只提供接口,不提供实现:1.Apache Commons Loging 2.slf4j
1.Apache Commons Loging(JCL)
Commons Loging本身只提供日志接口,具体实现在运行时动态寻找对应组件
App
JCL
Log4j jdk14 simpleLog
源码:
org.apache.commons.logging.LogFactory
org.apache.commons.logging.LogFactoryImpl
Log log = LogFactory.getLog(TestJcl.class);
return getFactory().getInstance(clazz);
LogFactoryImpl中getInstance()方法
newInstance()方法
discoverLogImplementation()方法
1.
private static final String[] classesToDiscover = {
LOGGING_IMPL_LOG4J_LOGGER,//org.apache.commons.logging.impl.Log4JLogger
"org.apache.commons.logging.impl.Jdk14Logger",
"org.apache.commons.logging.impl.Jdk13LumberjackLogger",
"org.apache.commons.logging.impl.SimpleLog"
};
for(int i=0; i<classesToDiscover.length && result == null; ++i) {
result = createLogFromClass(classesToDiscover[i], logCategory, true);
}
classesToDiscover按顺序
2.
createLogFromClass()方法中
try {
c = Class.forName(logAdapterClassName, true, currentCL);
} catch (ClassNotFoundException originalClassNotFoundException) {
......
try {
// Try the class classloader.
// This may work in cases where the TCCL
// does not contain the code executed or JCL.
// This behaviour indicates that the application
// classloading strategy is not consistent with the
// Java 1.2 classloading guidelines but JCL can
// and so should handle this case.
c = Class.forName(logAdapterClassName);
} catch (ClassNotFoundException secondaryClassNotFoundException) {
// no point continuing: this adapter isn't available
msg = secondaryClassNotFoundException.getMessage();
logDiagnostic("The log adapter '" + logAdapterClassName +
"' is not available via the LogFactoryImpl class classloader: " + msg.trim());
break;
}
}
如果classpath没加入org.apache.commons.logging.impl.Log4JLogger,
会报ClassNotFoundException,catch住,从而break,继续classesToDiscover中的下一个类
2.slf4j
全称Simple Logging Facade For Java(java简单日志门面)
App
slf4j
slf4j-log4j12 log4j-slf4j-impl logback-classic slf4j-jcl slf4j-jdk14
log4j log4j2 logback jcl JUL
......
3.slf4j替换jcl集成方案
spring app
jcl-over-slf4j
jcl ------------> slf4j
log4j log4j-slf4j-impl
jcl日志文件 log4j-core(log4j2)
log4j2日志文件