JCL(Commons Logging)的介绍
JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging"。
Commons Logging 的 目的是为 "所有的Java日志实现"提供一个统一的接口,它自身也提供一个日志的实现,但是功能非常常弱(SimpleLog)。所以一般不会单独使用它. 他允许开发人员使用不同的具体日志实现工具: Log4j, Jdk自带的日志(JUL) ,logback等(如果要用logback 的实现,需要jcl-over-slf4j-[version].jar 包) 开发人员可以不需要改动代码进行日志实现的切换。
JCL 有两个基本的抽象类:Log(基本记录器)和LogFactory(负责创建Log实例)。当commons-logging.jar被加入到classpath之后,它会心可能合理地猜测你喜欢的日志工具,然后进行自我设置,用户根本不需要做任何设置。默认的LogFactory是按照下列的步骤去发现并决定那个日志工具将被使用的(按照顺序,寻找过程如果条件符合将终止并返回) :
/**
* Convenience method to return a named logger.
* @param name logical name of the <code>Log</code> instance to be returned
*/
public static Log getLog(String name) {
switch (logApi) {
case LOG4J:
return Log4jDelegate.createLog(name);
case SLF4J_LAL:
return Slf4jDelegate.createLocationAwareLog(name);
case SLF4J:
return Slf4jDelegate.createLog(name);
default:
// Defensively use lazy-initializing delegate class here as well since the
// java.logging module is not present by default on JDK 9. We are requiring
// its presence if neither Log4j nor SLF4J is available; however, in the
// case of Log4j or SLF4J, we are trying to prevent early initialization
// of the JavaUtilLog adapter - e.g. by a JVM in debug mode - when eagerly
// trying to parse the bytecode for all the cases of this switch clause.
return JavaUtilDelegate.createLog(name);
}
}
默认的LogFactory实现使用以下发现过程来确定应使用的Log实现类型(在找到第一个肯定匹配项时(按顺序),该过程终止):
- 查找该工厂的名为org.apache.commons.logging.Log的配置属性 .
可以通过Java代码显式设置配置属性,但是更常见的是通过在类路径中放置一个名为commons-logging.properties的文件来进行设置。当存在这样的文件时,属性文件中的每个条目都将成为LogFactory的“属性”。如果类路径中有多个此类文件,则1.1之前的commons-logging版本仅使用找到的第一个文件。从版本1.1开始,每个文件都可以定义优先级密钥,并且使用优先级最高的文件(没有优先级定义表示优先级为零)。当多个文件具有相同的优先级时,将使用找到的第一个文件。建议在commons-logging.properties文件中定义此属性,以明确选择Log实现。
- 查找名为org.apache.commons.logging.Log的系统属性
- 如果Log4J日志记录系统在应用程序类路径中可用,请使用相应的包装器类(Log4JLogger)。
- 如果应用程序在JDK 1.4系统上执行,请使用相应的包装器类(Jdk14Logger)。
- 退回到默认的简单日志记录包装器(SimpleLog)。
详细请参见 http://commons.apache.org/logging/guide.html#Configuration
jcl和其他日志框架的配合使用
JCL 和 Log4j 结合使用(jcl是默认支持log4j日志框架的)
- 引入jar包
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
- 添加log4j.properties属性文件(属性文件需要添加自己的日志配置)
log4j.properties文件放入classpath下就行, 系统会自动搜素log4j 的实现, 并使用它。
也可通过手工配置,创建commons-logging.properties 文件. 放在classpath 下. 在其中加入以下配置: org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger - 代码使用
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class JclLog { //获取日志对象 private static Log log = LogFactory.getLog(getClass()); public void logPrint(){ //日志打印 log.info("I am log"); } }
log4j移除spring,hibernate等自身的日志打印
在log4j.properties添加代码
log4j.logger.包名=日志级别
如下例子:
log4j.logger.org.springframework=off //关闭spring的日志打印
log4j.logger.org.hibernate=ERROR //hibernate的日志打印级别调整为ERROR