02-Spring5日志组件Java学习之路-www.javaroads.com

Posted Java学习之路网

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了02-Spring5日志组件Java学习之路-www.javaroads.com相关的知识,希望对你有一定的参考价值。

Spring5日志组件

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

       由结果可知,绿色部分为spring加载配置文件时打印的日志,蓝色部分为我们手动打印的日志,可见我们已成功的使用slf4j完成了日志的输出。


以上是关于02-Spring5日志组件Java学习之路-www.javaroads.com的主要内容,如果未能解决你的问题,请参考以下文章

Android破解学习之路——简单的登录破解

Spring Boot的学习之路(01):缘起

Java日志框架学习--JUL和Log4j--上

Arm开发板+Qt学习之路-论can网通讯受log日志的影响

Qt学习之路2---窗口组件及窗口类型

后端开发者的Vue学习之路