Spring -- 日志

翻译 2016年12月01日 19:41:50

日志

日志对于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, 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

带有Native JCL 的容器

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

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

相关文章推荐

spring AOP日志框架

  • 2017-06-25 21:22
  • 46KB
  • 下载

Spring AOP 实现系统操作日志记录

AOP的相关术语: 1. 通知(Advice): 通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。 2. 连接点(Joinpoint): 程序能够应用通知的一个“时...

spring注解管理日志

从头认识Spring-3.4 简单的AOP日志实现-扩展增加检查订单功能,以便记录并检测输入的参数

这一章节我们再上一个章节的基础上加上一个检查订单功能1.domain蛋糕类:package com.raylee.my_new_spring.my_new_spring.ch03.topic_1_4;...

Spring MVC异常统一处理(异常信息的国际化,日志记录)

JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出)、不可预知的异常需要处理。一般dao层、service层的异常都...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)