Spring -- 日志

来源:互联网 发布:php 类与对象的关系 编辑:程序博客网 时间:2024/05/16 14:52

日志

日志对于Spring是一个非常重要的依赖,因为:

  • 它是一个强制的外部依赖
  • 所有人都想看到它们使用的工具的输出是什么。
  • Spring集成了很多其他工具,这些工具也有日志的依赖。这样就可以统一日志系统了。

    Spring中强制的日志依赖是JCL (Jakata Commons Logging API),JCL的对象 log 在Spring中是可见的。最好所有版本都使用同一个日志库,这样迁移时就比较方便,因为是向后兼容的。显式地依赖commons-logging就行。

不使用commons-logging

有两种方式用于切换commons-logging

  • 去除spring-core 模块的依赖,因为它是唯一一个显式地依赖commons-logging的模块。
  • 用一个空的jar替换commons-logging的依赖。(具体参考SLF4J FAQ)

去除commons-logging,把下面的内容添加到dependencyManagement

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

现在程序可能挂了,因为classpath中没有 JCL API 的实现,所以需要用新的来替换它,比如 SLF4J。

SLF4J

SLF4J 比 commons-logging 要更高效,更干净。
通用的做法是桥接 Spring 到 SFJ4J,然后提供显式的从 SLF4J 到 Log4J 的绑定,需要提供4个依赖(并且去除commons-loggings):桥, SLF4J API,到 Log4J 的绑定, Log4J 自身的实现:

<dependencies>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-core</artifactId>        <version>5.0.0.M3</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.5.8</version>    </dependency>    <dependency>        <groupId>org.slf4j</groupId>        <artifactId>slf4j-api</artifactId>        <version>1.5.8</version>    </dependency>    <dependency>        <groupId>org.slf4j</groupId>        <artifactId>slf4j-log4j12</artifactId>        <version>1.5.8</version>    </dependency>    <dependency>        <groupId>log4j</groupId>        <artifactId>log4j</artifactId>        <version>1.2.14</version>    </dependency></dependencies>

使用 Log4J

很多人使用 Log4J 做为日志框架,方法是:把 Log4J 放进 classpath,提供一个配置文件(log4j.propertieslog4j.xml),然后这样写Maven配置:

<dependencies>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-core</artifactId>        <version>5.0.0.M3</version>    </dependency>    <dependency>        <groupId>log4j</groupId>        <artifactId>log4j</artifactId>        <version>1.2.14</version>    </dependency></dependencies>

还有一些log4j.properties的配置:

log4j.rootCategory=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%nlog4j.category.org.springframework.beans.factory=DEBUG

带有Native JCL 的容器

有些容器自身就有 JCL的实现,比如 IBM 的 Websphere Application WAS。这经常会引起问题,而且不幸运地是,没有很好的解决方案,简单地去除去 commons-logging的依赖在多数情况下还不够。

这种 WAS 的情况下,最简单的事情就是反转 “class loader hierarchy”(IBM叫做parent last),这样一来就是应用控制 JCL 依赖,而不是容器控制。这个选项并不是一直打开的,但是也没有其他建议了,所以具体要看容器的功能和版本了。

0 0