Spring管理日志及日志框架替换

最近在看Spring文档,看到日志这块,之前没怎么具体了解过Spring中日志处理,看到了就记录下。看的Spring4.3.25的文档,基础环境是JDK1.8。
日志框架依赖是Spring唯一的外部强制依赖,Spring依赖的是Jakarta Commons Logging API (JCL)。Spring的做法是让 spring-core 模块显式地依赖commons-logging(JCL的经典实现),然后让其他模块在编译时依赖spring-core。
commons-logging的优点是不需要其他依赖就可以让程序记录日志,并且它有一个运行时查找算法来在classpath下查找其他日志框架,如果找到就用其他日志框架。如果没有就使用JDK的日志格式。
使用Log4j 1.2 or 2.x
Log4j 1.2 和默认 JCL 依赖 (commons-logging)协作时,只需要将 Log4j 放到 claasspath,并在 classpath 根路径下提供它的配置文件(log4j.properties or log4j.xml),如果使用Maven构建,使用如下依赖就可以:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.25.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使用如下依赖:

<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>

如果使用 SLF4J 和 Log4j,需要添加以下依赖:

<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>

不使用 Commons Logging 的方法。以上方法都是Commons Logging和其他日志框架。commons-logging API中的运行时查找算法对终端用户来说可能会比较方便,但可能有问题。如果想要屏蔽JCL标准的查找,有两种方式来关掉它:
1. 在spring-core模块中排除掉commons-logging依赖(只为 spring 框架中只有spring-core依赖了commons-logging)
2. 依赖一个特殊的commons-logging依赖,在库里commons-logging只是一个空jar(more details can be found in the SLF4J FAQ:http://www.slf4j.org/faq.html#excludingJCL  How do I exclude commons-logging as a Maven dependency?)

在spring-core中排除commons-logging依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.25.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

排除上边依赖后,程序就会因缺少jar包不能运行,下边使用SLF4J日志规范来代替JCL。
SLF4J(Simple Logging Facade for Java)规范默认使用Logback来作为默认实现。SLF4J可以跟常见的日志框架配合使用,同时SLF4J还可以将对其他日志的依赖桥接到它自己上,所以在Spring中使用SLF4J,需要用SLF4J-JCL来代替commons-logging,这样spring中对日志的调用都会去调用SLF4J的API,这样就可以在项目中统一管理日志。这样,使用以下依赖就可以:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.25.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>

以上代码中,使用排除commons-logging依赖的方法不是最好的,因为仅仅排除spring-core中的commons-logging依赖,可能其他jar包中也有依赖。所以最好使用SLF4J FAQ:http://www.slf4j.org/faq.html#excludingJCL里依赖空jar的方式。

附件是一个小demo

发布了35 篇原创文章 · 获赞 14 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/U___U/article/details/102708422