Spring的日志管理
一、spring的日志依赖
Logging是spring中唯一强制的外部依赖,spring中默认使用的日志是commons-logging
,简称JCL
,这里说的强制性,是因为在spring-core
这个模块中引入了该依赖。不过,引入了该依赖,也无需做任何其他的配置,它是日志门面
,它内部会有自己的算法去找日志门面的实现类,比如log4j
,如果说没有引入其他日志依赖,它默认就会去找JDK自带的java.util.logging
简称jul
作为其日志实现类,所以说用起来还是赏心悦目的!
二、使用log4j1.x和2.x和jul
log4j1.x版本已经停止更新了,log4j2.x习惯性叫做
log4j2
。
log4j
出现很久了,一直有很多人在使用,但是毕竟停止更新了,已经不再推荐使用了。
如何使用log4j
作用spring
自带的commons-logging
的日志实现呢?
用起来也是相当简单啊,我们以Maven为例,首先添加Log4j的jar包,另外需要一份日志配置文件 (log4j.properties
or log4j.xml
),放在类路径的根目录下。
下面是maven:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.24.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
下面一个简单的log4j
的配置文件
log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
log4j.category.org.springframework.beans.factory=DEBUG
同样的如果说使用log4j2
作为JCL
的日志实现,和log4j
用法是一样的。
下面这是Maven
依赖
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
If you also wish to enable SLF4J to delegate to Log4j, e.g. for other libraries which use SLF4J by default, the following dependency is also needed:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
log4j2.xml
的一个简单示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.springframework.beans.factory" level="DEBUG"/>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
如果没有提供log4j
、log4j2
之类的日志实现,那么commons-logging
就会默认使用jdk
自带的java.util.logging
。
二、不使用自带的Commons Logging
如果觉得spring自带的JCL
不合适,可以自己进行替换,有以下两种方法:
- 直接从
spring-core
排除掉commons-logging
的依赖,因为spring-core
是唯一明确依赖JCL
的模块 - 依赖于一个特殊
commons-logging
,它是一个空jar包,参考slf4j
// 从spring-core中排除掉
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.24.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
使用SLF4J代替jCL
需要下面几个依赖,一个是排除掉JCL
,第二个是要架起JCL
与slf4j直接的桥梁,毕竟如spring-core
中使用了,其实这里slf4j
巧妙的将诸如spring-core
中用到的commons-logging
的类或接口,在jcl-over-slf4j
中写了一份同名的,但在具体的方法或接口等实现类中,再去具体找其他日志实现框架,它起到了一个日志门面的作用。
第三个是slf4j对接log4j的jar包,因为Log4j早就停更了,所以啊,这又是适配Log4j与slf4j之间的Jar包,最后一个就是log4j
自身的jar包了。
下面是依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.24.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
如果选用logback
作用slf4j
,那就简单多了,因为logback
出现的比较晚,它实现了slf4j
,那就不需要中间包了,下面是Maven依赖。
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
</dependencies>
以上是阅读spring官方文档时个人的一点点理解,记之于笔墨。
附官方文档链接:spring官方文档