spring boot 日志(log)处理

spring boot 日志(log)处理

概述

本文介绍spring boot项目中配置日志模块的过程。

后端服务中,日志模块是必备模块,比如在生产环境下,详细的日志可用于分析偶发故障。

日志门面与日志底层库

Java中,日志模块包含日志门面和日志底层库。日志门面是一个抽象的接口层,常用的有SLF4Jcommons-logging,这2个大同小异,基本上互相兼容,早期常用commons-logging,现在用SLF4J 较多;日志底层库负责对门面接口的具体实现,如常见的Java Util LoggingLog4J2Logback等等。

在项目中,应该使用日志门面打印日志:

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语句 – TRACEDEBUG级别

主要内容:

## 模块日志级别
# 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


评论