
概述
本文介绍spring boot项目中配置日志模块的过程。
后端服务中,日志模块是必备模块,比如在生产环境下,详细的日志可用于分析偶发故障。
日志门面与日志底层库
Java中,日志模块包含日志门面和日志底层库。日志门面是一个抽象的接口层,常用的有SLF4J 、commons-logging,这2个大同小异,基本上互相兼容,早期常用commons-logging,现在用SLF4J 较多;日志底层库负责对门面接口的具体实现,如常见的Java Util Logging 、Log4J2、Logback等等。
在项目中,应该使用日志门面打印日志:
import org.slf4j.LoggerFactory;
...
private static final org.slf4j.Logger log = LoggerFactory.getLogger(HelloController.class);
日志底层库替换不影响上层代码。
spring boot日志模块
spring boot默认使用logback作为日志底层库,在spring boot web starter中已经引入了日志相关的依赖,无需再作依赖配置。
在java中,有很多日志框架,看起来很混乱,不过没关系,spring boot已经作好了依赖配置,不必过于关注细节,直接用就可以。
spring boot也可以加载指定的日志底层库和对应的配置文件,可参考官网文档。
日志输出什么样
不做任何配置,spring boot 项目默认的日志输出
2019-01-24 15:14:11.446 INFO 1836 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8096 (http)
2019-01-24 15:14:11.474 INFO 1836 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2019-01-24 15:14:11.475 INFO 1836 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.14]
2019-01-24 15:14:11.481 INFO 1836 --- [ main] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jre1.8.0_191\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jre1.8.0_191/bin/server;C:/Program Files/Java/jre1.8.0_191/bin;C:/Program Files/Java/jre1.8.0_191/lib/amd64;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Program Files\TortoiseGit\bin;C:\Users\wuhai\AppData\Local\Microsoft\WindowsApps;C:\Users\wuhai\AppData\Local\atom\bin;C:\Users\wuhai\Desktop;;.]
2019-01-24 15:14:11.597 INFO 1836 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-01-24 15:14:11.598 INFO 1836 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1204 ms
2019-01-24 15:14:11.792 INFO 1836 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-01-24 15:14:11.958 INFO 1836 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8096 (http) with context path ''
每条日志的内容:
- 日期与时间:精确到毫秒
- 日志级别:
TRACE
,DEBUG
,INFO
,WARN
,ERROR
- 进程ID
---
分割符号,表示日志信息正式开始- 线程名称:方括号内
- 打印日志的类名称
- 日志信息:冒号后面的内容
项目中的常用日志设置
实际项目中,常见的日志配置包括:
- 日志格式:可以配置不同于默认格式的日志输出
- 日志级别:不同模块可以配置不同级别
- 日志文件配置:目录、文件名、保留时间、文件大小
- 不同环境(生产/测试/开发)的日志配置:生产、测试、开发不同环境日志输出级别不同;开发时一般不需要输出到文件
下面按照本系列教程的老规矩,通过一个实际项目说明日志的配置使用。
项目内容
创建项目,进行日志格式、日志级别、日志输出文件配置,以及不同环境下的日志配置,然后运行程序打印日志,查看配置效果。
要求
- JDK1.8或更新版本
- Eclipse开发环境
如没有开发环境,可参考spring boot 开发环境搭建(Eclipse)
项目创建
创建spring boot项目
打开Eclipse,创建spring boot的spring starter project项目,选择菜单:File > New > Project ...
,弹出对话框,选择:Spring Boot > Spring Starter Project
,在配置依赖时,勾选web
,完成项目创建。
项目配置
如下图,项目的配置文件,除了默认配置文件,还包括不同环境下的配置文件,不同环境的配置可参考 spring boot 环境配置(profile)切换。
application.properties
– 默认配置文件application-dev.properties
– 开发环境配置文件application-prod.properties
– 生产环境配置文件application-test.properties
– 测试环境配置文件
application.properties文件内容
在这个文件中,日志配置的内容是各个环境的共有部分:
- 整个项目的日志级别
- 控制台的日志格式
## 生产/开发等环境配置, 加载不同的配置文件
spring.profiles.active=prod
## 服务器端口,默认是8080
server.port=8096
## 日志配置
# 整个项目的日志级别,包括spring等第三方库,一般采用INFO级别
logging.level.root=INFO
# 定义控制台日志格式,底层日志库是logback(默认)时有效
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-10level %-50logger{50} : %msg%n
说明一下日志格式:
%d{yyyy-MM-dd HH:mm:ss.SSS}
日志时间,精确到毫秒级[%thread]
当前线程名称%-10level
日志级别,-10
表示左对齐占用10个字符空间%-50logger{50}
打印日志的类,-50
表示左对齐占用50个字符空间,{50}
长度不超过50个字符
对默认日志格式做了一些修改,大家可以根据自己需要修改。
application-dev.properties与application-test.properties
测试环境与开发环境的日志配置一样,主要包括:
- 应用层的日志级别 – 为调试开发需要,会配置为
TRACE
级别 - 数据访问的日志级别,可以打印出sql语句 –
TRACE
或DEBUG
级别
主要内容:
## 模块日志级别
# com.qikegu.demo的日志级别
logging.level.com.qikegu.demo=TRACE
# mybatis日志级别,可以打印出查询语句等信息
logging.level.com.apache.ibatis=TRACE
logging.level.java.sql.Connection=DEBUG
logging.level.java.sql.Statement=DEBUG
logging.level.java.sql.PreparedStatement=DEBUG
application-prod.properties
生产环境日志需要能输出到文件中,所以要配置文件;生产环境的日志级别会配置的高一些,一些调试信息就不需要打印出来了。配置主要包括:
- 应用层的日志级别 – 配置为
WARN
级别 - 数据访问的日志级别,可以打印出sql语句 – 配置为
WARN
级别 - 输出文件配置
配置内容:
## 模块日志级别
# com.qikegu.demo的日志级别
logging.level.com.qikegu.demo=WARN
# mybatis日志级别,可以打印出查询语句等信息,此处使用group方式把模块归为一组统一设置级别为warn
logging.group.mybatis=com.apache.ibatis,java.sql.Connection,java.sql.Statement,java.sql.PreparedStatement
logging.level.mybatis=WARN
# 定义日志文件的存储路径及文件名
logging.file=log/qikegu.com.log
# 日志保留最长天数(底层日志库是logback(默认)时有效)
logging.file.max-history=30
# 日志文件大小限制(单位字节),超过会分割(底层日志库是logback(默认)时有效)
logging.file.max-size=1024
# 定义文件日志格式(底层日志库是logback(默认)时有效)
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-10level %-50logger{50} : %msg%n
代码实现
项目目录结构如下图,实现一个接口,调用此接口打印日志。
HelloController控制器
访问/hello
接口,打印日志信息
package com.qikegu.demo.controller;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
// 使用slf4j日志门面
private static final org.slf4j.Logger log = LoggerFactory.getLogger(HelloController.class);
// 当前环境配置名称
@Value("${profile.name}") //读取当前环境配置名称
private String profileName;
@RequestMapping(value="/hello", method = RequestMethod.GET, produces="application/json")
public String hello() {
log.trace("trace 信息");
log.debug("debug 信息");
log.info("info 信息");
log.warn("warn 信息");
log.error("error 信息");
return "当前环境:" + profileName;
}
}
运行
Eclipse左侧,在项目根目录上点击鼠标右键弹出菜单,选择:run as -> spring boot app
运行程序。 打开浏览器访问接口,运行结果如下:
浏览器访问接口
控制台日志输出
生成的日志文件
总结
完成。由于作者水平有限,错漏缺点在所难免,欢迎批评指正。
完整代码
github springboot-log-demo