Part 1 Overview of Spring Framework
闲暇时间看看Spring的文档,一边看一边记录翻译的。英语不好……
日志
日志对于Spring是一个非常重要的依赖关系。因为 1,它是唯一一个强制的外部依赖;2,每个人都想看一些他们使用的工具的输出;3,Sping集成了一些其他的工具他们都选择了日志依赖。应用开发人员的一个目标是为整个应用在一个中心位置配置统一的日志,包括所有的外部组件。自从有很多日志框架可以选择以后这是困难的。
Spring的强制日志依赖是Jakarta Commons Logging API (JCL)。我们重新编译了JCL 我们也使 JCL 日志对一个扩展了Spring框架的类对象可见。这对于使用者来说是重要的,所有的Spring版本都使用一样的日志库:强制是容易的,因为保留可向后的兼容性,甚至一个扩展的Spring的应用。 我们这样做使得一个Spring的模块明确的依赖commons-logging(强制依赖一JCL),然后使得其他的模块编译的时候依赖于它。如果你使用Maven举个例子,想要你在哪里打包依赖于commons-logging,它来自Spring一个被叫做spring-core的特殊中心模块。
commons-logging最好的事情就是你不需要其他的东西确保你的应用工作。他有一个运行时发现算法在众所周知的目录 classpath 下查找其他的日志框架,使用一个它认为合适的(或者你告诉他那一个是你需要的)。如果没有可用的你得到的好看的日志只是来自JDK(java.util.logging 或者 简称为 :JUL)。你应该找到Spring 工作的应用 大多数情况下日志愉快的在console输出,这是重要的。
使用log4j 1.2 或者2.x
注意:
Log4j 1.2 同时也是一个行输出(EOL), log4j 2.3 是Java 6兼容的最新版本,更新的Log4j 2.x版本需要Java7 以上。
许多人使用Log4J 作为日志框架为了配置和管理的目的,它是高效的和稳定的。实际上,它是我们建立和陨石是使用的。spring 也提供也其他的一些工具用来配置和初始化 log4j ,所以它有一个选择在编译时依赖 Log4j 在一些模块中。
为了使 Log4j 1.2 和默认的JCL(commons-loggings,)一起工作,你需要把Log4j 放到classpath路径中然后提供他的配置文件(log4j.properties 或者log4j.xml)。 然后 对于Maven用户这是你的依赖声明:
< dependencies>
< dependency>
< groupId>org.springframework< /groupId>
< artifactId>spring-core< /artifactId>
< version>4.3.8.RELEASE< /version>
< /dependency>
< dependency>
< groupId>log4j< /groupId>
< artifactId>log4j< /artifactId>
< version>1.2.17< /version>
< /dependency>
< /dependencies>
这里有一些 log4j.properties 到console的例子:
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
为了使用log4j 2.x 和 JCL 一起, 你应该把log4j 放到classpath 路径下然后提供他们的配置文件 (log4j.xml或者 log4j.properties 或者其他支持的配置格式)。对于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>
如果你也希望SLF4J 替代 Log4j,例如 其他的库采用默认的日志框架是 SLF4J,下面的依赖也是需要的:
< dependencies>
< dependency>
< groupId>org.apache.logging.log4j< /groupId>
< artifactId>log4j-slf4j-impl< /artifactId>
< version>2.6.2< /version>
< /dependency>
< /dependencies>
这里也有一个关于输出日志到console窗口的log4j2.xml例子:
避免Commons 日志
很不幸,运行时发现算法在一个标准的commons-logging API里。这很方便使用者,也可能带来问题。如果你想要避免 JCL的日志查看,有两种基础的方法来选择关闭它。
- 从Spring-core 模块中不包含依赖(它是唯一模块,明确依赖于commons-logging)
- 取决于一个特殊的commons-loging依赖,用一个空的jar包替换。(更多详情查看SLF4JFAQ)
要执行commons-logging,添加下述到你的dependencyManagement 区域
< dependencies>
< dependency>
< groupId>org.springframework
< artifactId>spring-core< /artifactId>
< version>4.3.8.RELEASE< /version>
< exclusions>
< exclusion>
< groupId>commons-logging< /groupId>
< artifactId>commons-logging< /artifactId>
< /exclusion>
< /exclusions>
< /dependency>
< /dependencies>
现在这个应用时下是被破坏的,因为他没有在classpath下实现JCL API ,所以为了修复它,一个新的将要被提供。下部分我们将展示怎样提供一个用SLF4J替换JCL的执行器。
Using SLF4J with Log4j or Logback
不会翻译我就写原文了……
java简单的日志门面(SLF4J)是一个被其他库广泛使用的API通常被用在Spring。它典型的被用于Logback,这是一个本地执行的SLF4J API。
SLF4J 提供绑定许多通用的日志框架。包括Log4J ,相反:也作为连接其它日志框架和自己的桥梁。所以为了把SLF4J这个日志框架和Spring一起使用你需要用 SLF4J-JCL 作为桥梁替换 commonsp-logging 依赖。一旦完成了替换,Spring内部调用日志将传递到SLF4J API的调用。因此如果其它的库在你的应用程序中用到这个API ,你需要一个单独的地方配置和管理日志。
一个普通的选择用于连接Spring和SLF4J ,然后提供明确的绑定从SL4J 到Log4J。你需要提供几种依赖(不包括已经存在的 commons-logging): JCL 桥梁,绑定 SLF4J 到Log4J,Log4J自己提供。在Maven项目找个你这样做:
< dependencies>
< dependency>
< groupId>org.springframework< /groupId>
< artifactId>spring-core< /artifactId>
< version>4.3.8.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>
在 SLF4J 的使用者的选择是用更少的步骤和产生更少的依赖关系,直接绑定到Logback,这样移除了外部绑定步骤因为Logback直接实现了SLF4J,所以你只需要依赖于两个库,称作jcl-over-slf4j 和 logback:
< dependencies>
< dependency>
< groupId>org.slf4j
< artifactId>jcl-over-slf4j
< version>1.7.21
< /dependency>
< dependency>
< groupId>ch.qos.logback
< artifactId>logback-classic
< version>1.1.7
< /dependency>
< /dependencies>
使用JUL (java.util.logging)
一般日志默认将会被java.util.logging代替,在classpath下没有发现提供Log4J。所以没有建特殊殊的依赖:仅仅是使用Sping 对日志输出到 java.util.logging 没有外部的依赖,另外 在一个单例的应用中(基于习惯或者在JDK水平默认的设置)或者一个服务器应用的日志系统(这是广义的 JUL 设置)。
网页服务器通用日志
Spring 应用可能运行在一个容器中,然后自己提供 JCL 的实现, 例如: IBM的 WebSphere Application Server (WAS)。这并不是问题本身但是导致了两种不同的情况应该被明白。
在一个“parent first” 类加载器代理模块,应用将总是连接服务器提供的通用日志版本。代理到WAS日志系统(它通常是基于 JUL 的)。一个应用被提供多种变种的 JCL , 无论是标准通用日志还是 JCL-over-SLF4J 连接器实际上都将被忽略与任何本地包含的日志。
“parent last ” 代理模块(是一个规则的Sevelet容器默认的, 但是明确配置在WAS),应用提供的通用日志将要被采纳,在你的应用中, 使你设置一个本地日志供应者, 例如: log4J 或者Logback。万一没有提供一个本地日志,按照规则通用日志将默认用JUL作为默认的代理, 实际上WebSphere 的日志子系统有点像“parent first”的情况。
总之, 从自然后允许本地提供者以及服务器的日志子系统,我们推荐依赖Spring应用在“parent last”模式。