对于开发而言,日志非常重要,有效的输出日志,可以极大的帮助定位问题,特别是定位线上问题。
1 SpringBoot对Logback的支持
SpringBoot支持Java Util Logging
、Log4J2
、Logback
等多种日志实现。默认情况下,使用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应用中,有两种方式配置日志:
- 在
application.properties
中进行配置 - 使用单独的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输出日志,并且,还介绍了一个实用的技巧,就是如何根据环境加载日志配置。不过,实际的开发中,这些还远远不够,还有很多问题需要解决,比如:
- 如何收集多台服务器的日志
- 如何有效的存储日志
- 如何方便高效的查询日志
后续,会继续介绍更多的日志收集方案。关注我: