在SpringBoot应用中使用Logback输出日志

·  阅读 1586
在SpringBoot应用中使用Logback输出日志

对于开发而言,日志非常重要,有效的输出日志,可以极大的帮助定位问题,特别是定位线上问题。

1 SpringBoot对Logback的支持

SpringBoot支持Java Util LoggingLog4J2Logback等多种日志实现。默认情况下,使用Logback。所以,开发中,可以容易集成Logback,并且SpringBoot提供了一些默认的配置,可以很方便的将日志输出到控制台或者文件中。

使用Starter[spring-boot-starter-web]创建一个SpringBoot应用,创建一个maven项目,在pom.xml中添加依赖:

<?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.spingboot.one</groupId>
    <artifactId>logback-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
复制代码

然后,创建包com.springboot.one,并在该包下创建主类Application.java

package com.springboot.one;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

复制代码

启动后,就可以在控制台看到输出的日志:

2018-08-15 22:26:08.731  INFO 3820 --- [           main] com.springboot.one.Application           : No active profile set, falling back to default profiles: default
2018-08-15 22:26:09.119  INFO 3820 --- [           main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@1b083826: startup date [Wed Aug 15 22:26:09 CST 2018]; root of context hierarchy
2018-08-15 22:26:12.792  INFO 3820 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2018-08-15 22:26:12.830  INFO 3820 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
复制代码

以上,可以清晰的看到日志的时间,级别,线程等信息。

2 配置Logback

在SpringBoot应用中,有两种方式配置日志:

  1. application.properties中进行配置
  2. 使用单独的logback配置文件

这两种方式都可以对Logback进行相关的配置,两个方式各有优劣,但是,实际开发中,比较推荐使用第二种方式进行配置,主要有以下优点:

  • 与其它配置分离,日志配置集中于此文件中
  • 配置比较灵活

2.1 将日志输出到控制台

接下来,在项目中,添加单独的logback配置文件:logbackd-emo\src\main\resources\logback-spring.xml,注意配置文件的名称为logback-spring.xml,遵循这个约定,SpringBoot会默认加载该配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">

    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

    <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
    </root>

</configuration>
复制代码

以上,通过配置将日志输出到控制台,将日志级别调成DEBUG级别,这里直接引用了SpringBoot内置的配置文件,当然这个也可以根据自己的需求重新配置。

2.2 将日志输出到文件

也可以将日志输出到指定的文件中,这里可以直接引用SpringBoot内置的配置文件:

<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
复制代码

不过,这个配置文件功能过于简单,通常,在项目中都会自定义,比如,像这样:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">

    <property name="LOG_HOME" value="${user.dir}/logs/"/>
    <property name="APP_NAME" value="app-server"/>

    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>

    <logger name="org.springframework.data.mongodb.core.MongoTemplate" level="debug"/>
    <logger name="org.springframework.data.repository.config" level="WARN"/>

</configuration>

复制代码

将日志输出文件,需要考虑更多内容:

  • 日志文件的路径,在生产环境中,可能需要单独的分区。
  • 日志文件的命名规则,使用日期命名可以方便查找。
  • 日志的滚动策略,如果日志量不大,可以按天切割日志。

同时,在该配置中还对一些日志进行了级别的调整,减少无用的日志,对于定位问题非常重要。

3 根据环境加载日志配置

上述的的内容基本都是Logback的相关配置,SpringBoot对于日志配置还做了一些特殊的扩展,其中,有一个功能就特别有用,就是在日志配置中支持Profile特性,通过Profile就可以很容易实现根据环境加载日志配置。

比如,当前有三个环境,日志的输出要求各不相同:

  • 生产环境:输出到文件
  • 开发环境:输出到控制台
  • 测试环境:输出到文件

那现在就可以这样配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">

    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${user.dir}/logs/app.log}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />

    <springProfile name="dev">
        <root level="DEBUG">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>

    <springProfile name="prod, test">
        <root level="DEBUG">
            <appender-ref ref="FILE" />
        </root>
    </springProfile>

</configuration>
复制代码

然后,在application.properties中进行Profile的配置:

spring.profiles.active=prod
复制代码

此时,就是运行在生产环境,日志就会输出到文件中。

4 小结

本文主要介绍了如何在SpringBoot中使用Logback输出日志,并且,还介绍了一个实用的技巧,就是如何根据环境加载日志配置。不过,实际的开发中,这些还远远不够,还有很多问题需要解决,比如:

  1. 如何收集多台服务器的日志
  2. 如何有效的存储日志
  3. 如何方便高效的查询日志

后续,会继续介绍更多的日志收集方案。关注我:

weixin

分类:
后端
分类:
后端