Spring教程02-日志组件

阅读原文

1、Spring依赖管理

如果我们使用Maven进行依赖关系管理,我们甚至不需要显式提供日志记录的依赖关系。 例如,要创建应用程序上下文并使用依赖注入来配置应用程序,我们的Maven依赖关系将如下所示:

<properties>
	<!--spring版本设置-->
	<spring.version>5.1.3.RELEASE</spring.version>
</properties>

<!--spring依赖-->
<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>${spring.version}</version>
	</dependency>
</dependencies>

由于在开发过程中,我们可能会发现第三方库或另一个Spring项目将传递依赖项会拉入旧版本,这样有可能会造成版本冲突的问题。为了克服这种问题,Maven支持“物料清单”(BOM)依赖的概念。 我们可以在dependencyManagement部分中导入spring-framework-bom,以确保所有spring依赖项具有相同的版本。

<properties>
	<!--spring版本设置-->
	<spring.version>5.1.3.RELEASE</spring.version>
</properties>

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-framework-bom</artifactId>
			<version>${spring.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

<!--spring依赖-->
<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
	</dependency>
</dependencies>

至此,我们就完成了用Maven构建spring项目基础配置。

2、Spring日志组件

日志记录是Spring的一个非常重要的依赖,因为a)它是唯一的强制性的外部依赖,b)每个开发者都喜欢从自己使用的工具中看到一些日志输出,以便记录程序在运行过程中出现的问题,和c)Spring集成了许多日志依赖的选择。开发人员的目标之一通常是在整个应用程序的中心位置配置统一的日志记录,包括所有的外部组件。不过这种想法实现起来确实比较困难,因为在已有的应用中可能已经存在有太多的日志框架,使得我们在整合的过程中有很大的阻碍。
Spring中强制的日志依赖是Jakarta Commons Logging API(JCL)。对于开发者来说,所有版本的Spring都使用相同的日志库很重要:迁移很容易,因为即使使用扩展的Spring应用程序也保持向后的兼容性。Spring采用其组件中的一个模块显式地依赖commons-logging(JCL的规范实现),然后使所有其他模块在编译时依赖它。
关于commons-logging的好处是,我们不需要任何其他东西来就能让我们的应用程序工作。它有一个运行时发现算法,该算法在众所周知的classpath路径下寻找其他日志框架,并使用它认为是合适的(或者我们可以告诉它,如果我们需要)。如果没有其他可用的,我们可以从JDK(java.util.logging或简称JUL)获得漂亮的查看日志。我们应该会发现,我们的Spring应用程序日志在大多数情况下可以很好地工作和记录到控制台,这一点很重要。

2.1、使用slf4j进行日志绑定

SLF4J是一个更简洁的依赖,在运行时比commons-logging更高效,因为它使用编译时绑定,而不是在集成的日志框架运行时才发现。SLF4J提供了对许多常见日志框架的绑定,因此我们通常可以选择一个已经使用的日志组件进行日志绑定和管理。
SLF4J提供对许多常见日志框架(包括JCL)的绑定,并且它也做了反向工作:充当其他日志框架与其自身之间的桥梁。因此,要在Spring中使用SLF4J,需要使用SLF4J-JCL桥替换commons-logging依赖关系。一旦我们这样做,那么来自Spring内部的日志调用将被转换为对SLF4J API的日志调用,因此如果应用程序中的其他库使用该API,那么我们有一个地方可以配置和管理日志记录。
常见的选择可能是将Spring桥接到SLF4J,然后提供从SLF4J到Log4J的显式绑定。我们需要提供4个依赖(并排除现有的commons-logging):桥梁,SLF4J API,绑定到Log4J和Log4J实现本身。配置如下:

<!--slf4j依赖-->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jcl-over-slf4j</artifactId>
	<version>${slf4j.version}</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>${slf4j.version}</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>${slf4j.version}</version>
</dependency>
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.14</version>
</dependency>

到此我门就完成了日志从commons-logging桥接到slf4j并通过log4j组件打印日志的依赖配置,当然这个中日志配置显得比较繁琐,其实我们也可以使用logback进行日志绑定,这部分在后续SpringBoot学习中再行介绍;下面贴出log4j简单的配置文件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

我们只要需要将log4j.properties文件放置程序的类加载路径即可。
最后给完整配置:
使用slf4j:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.java.roads</groupId>
    <artifactId>spring_01</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <!--spring版本设置-->
        <spring.version>5.1.3.RELEASE</spring.version>
        <slf4j.version>1.7.12</slf4j.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>${spring.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--spring-context依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>

        <!--spring-core依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <exclusions>
                <!--commons-logging解除依赖-->
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


        <!--slf4j依赖-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
    </dependencies>
</project>

至此spirng日志配置依赖已全部完成
为了测试日志功能我们先引入spring核心元数据配置文件application.xml,当然这个名字我们可以随便命名。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

2.1.1、验证Spring日志配置程序

编写一个验证日志配置的程序CheckLogEnable.java

public class CheckLogEnable {
    //取得日志实例
    public static Logger logger = LoggerFactory.getLogger(CheckLogEnable.class);
    public static void main(String[] args){
        //加载Spring源数据配置文件
        ApplicationContext context =
                new ClassPathXmlApplicationContext(new String[] {"application.xml"});
        logger.debug("取得SpringContext名称:{}", context.getDisplayName());

    }
}

运行结果

14:35:48,739 DEBUG main support.ClassPathXmlApplicationContext:590 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@49993335
14:35:49,012 DEBUG main xml.XmlBeanDefinitionReader:395 - Loaded 0 bean definitions from class path resource [application.xml]
14:35:49,083  INFO main roads.CheckLogEnable:27 - 取得SpringContext名称:org.springframework.context.support.ClassPathXmlApplicationContext@49993335

由结果可知我们已成功的使用slf4j完成了日志的输出。

更多最新技术文章,请关注“冰点IT”公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值