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>

如果没有提供log4jlog4j2之类的日志实现,那么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官方文档

你所看得到的天才不过是在你看不到的时候还在努力罢了!
原文地址:https://www.cnblogs.com/heliusKing/p/11192263.html