SpringBoot日志配置详情

一、介绍

在所有的项目中,日志是必不可少的,为了高效清晰的查找日志,可以配置日志输出的等级和格式。

在配置后,可以自定义输出日志到指定目录,可以按照天数来分割日志,可以按照日志级别分割日志,可以按照大小来进行分割日志。

输出的日志方式,可以说五花八门,但总有一款适合你的项目

二、简单配置

1、日志的级别

关于日志的级别打印,需要搞清楚日志等级的优先级

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; @Slf4j
@Component
public class LoggerTask { @Scheduled(cron = "0/30 * * * * ?")
public void logTask(){
// 日志级别,由低到高,trace < debug < info < warn < error
log.trace("TRACE");
log.debug("DEBUG日志");
log.info("INFO日志");
log.warn("WARN日志");
log.error("ERROR日志");
} }

在SpringBoot的yaml配置文件中,添加相关日志的配置文件

# 日志配置
logging:
level:
# 代表工程所有类的日志等级
root: info

以下是日志的打印,发现比info级别低的debug和trace级别的日志没有打印出来。

在实际项目中,除了日志输出的规范,合理利用日志等级,也可以达到清晰日志的规范,排查问题会变得高效

除了logging.level.root,还可以指定对应包和类的日志级别

配置文件和测试代码

# 日志配置
logging:
level:
# 代表工程所有包的日志等级
root: info
# 指定包下的日志等级
com.banmoon.spring_boot_logger.mapper: debug
import com.banmoon.spring_boot_logger.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; @Slf4j
@Component
public class LoggerTask { @Autowired
private UserMapper userMapper; /**
* 定时去查询数据库表
*/
@Scheduled(cron = "10 * * * * ?")
public void dbDemonstration(){
log.info("=====================");
int count = userMapper.countByExample(null);
log.info("用户条数:{}", count);
log.info("=====================");
} }

2、日志的打印格式

虽然springBoot的日志打印格式足够清晰明了,但它支持自定义打印格式,还是记录一波吧

配置文件指定格式

# 日志配置
logging:
pattern:
# 格式化控制台输出的日志
console: "%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %blue([%-5level]) %cyan(%logger{36}:%line) %msg%n"

简单说明一下这段格式化的意思,学会大家就可以配置自己喜欢的格式了

%red: 指定颜色,记得用小括号将内容包裹起来
%d: 日期时间,后面的是日期格式化
%thred: 线程名
%-5level: 日志级别,%-5表示的是打印字符个数,如果个数不足则用空格补上
%logger{36}: 输出日志的包名,最长36字符,超过则会简化,只会输出后面几个包名和类名
%line: 输出日志的行数
%msg: 输出的日志信息
%n: 换行

3、日志的持久化输出

在日常的开发中,控制台输出的日志就满足开发的需求了。但是在测试生产环境下,日志的持久化保存就显得格外的重要,springBoot也考虑到了这一点,也拥有相对应的配置

# 日志配置
logging:
# 输出日志文件的路径,log=相对路径,D:/log=绝对路径,文件名默认为spring.log
path: D:/log
# 输出到指定的文件中,同样可以指定相对路径
file: log/spring-boot-logger.log
pattern:
# 持久化输出日志的格式,颜色不起作用,需要区别于控制台
file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}:%line %msg%n"

相对路径,指定logging.file输出

绝对路径,指定logging.path输出

注意:logging.pathlogging.file只需指定一个便可,两个都指定时,仅会输出logging.file的日志

三、高级配置

在创建springBoot项目后,简单的日志配置可以满足我们大部分的需求,但我们有时需要高度自定义的日志,比如说

  • 按天生成日志:一天一份日志,排查问题就方便的多
  • 按日志大小来切割日志:假如日志超过存储大小,它会自动将日志写入新的文件中
  • 按日志等级输出独立的日志:一般选择ERROR级别的日志单独输出

1、配置模板

resources目录下,创建文件logback/logback.xml,并在配置文件指定logback的配置文件

logging:
config: classpath:logback/logback.xml

logback.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="true"> <!-- 获取日志文件的输出路径 -->
<springProperty scope="context" name="LOG_PATH" source="logging.log_path"/>
<!-- 获取该应用的名称 -->
<springProperty scope="context" name="APPLICATION_NAME" source="spring.application.name"/> <!-- 定义日志输出格式和颜色 -->
<property name="LOG_FORMAT_ONE" value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %blue([%-5level]) %cyan(%logger{36}:%line) %msg%n" />
<property name="LOG_FORMAT_TWO" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}:%line %msg%n" /> <!-- 输出到控制台 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码格式化 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${LOG_FORMAT_ONE}</Pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 过滤器,此过滤器低于阈值的不再显示 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
</appender> <!-- 时间日期滚动日志 -->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 输出的日志远程,当天的日志名称 -->
<file>${LOG_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.log</file>
<!-- 策略配置 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 保存归纳的日志 -->
<fileNamePattern>${LOG_PATH}/${APPLICATION_NAME}/%d{yyyy-MM-dd}/${APPLICATION_NAME}.log</fileNamePattern>
<!-- 日志保存的天数 -->
<maxHistory>180</maxHistory>
<!-- 总容量 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<!-- 日志输出编码格式化 -->
<encoder>
<pattern>${LOG_FORMAT_TWO}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender> <!-- 时间日期滚动日志,只记录error级别的日志 -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}_error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${APPLICATION_NAME}/%d{yyyy-MM-dd}/${APPLICATION_NAME}_error.log</fileNamePattern>
<maxHistory>180</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_FORMAT_TWO}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 过滤器,日志级别过滤,仅输出error日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender> <!-- 指定输出的日志等级,root代表工程所有包 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_ERROR" />
</root> <!-- 指定输出的日志等级,指定包路径,此包下都以设置的等级输出 -->
<!-- additivity表示日志是否向上传递,如果为true,日志在root可能会再次打印 -->
<logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_ERROR" />
</logger> </configuration>

2、通过运行环境来指定对应的输出策略

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="true">
<!-- 或者通过环境来指定输出的策略 -->
<springProfile name="dev">
<include resource="logback/logback-dev.xml" />
</springProfile>
<springProfile name="test | prod">
<include resource="logback/logback-prod.xml" />
</springProfile>
</configuration>

logback-dev.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<included>
<!-- 开发环境,日志只至控制台 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root> <logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
</included>

logback-prod.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<included>
<!-- 测试,生产环境,持久化日志文件 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_ERROR" />
</root> <logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_ERROR" />
</logger>
</included>

3、相关配置标签

标签名 属性 作用
configuration scan:是否扫描日志配置文件,默认为true
scanPeriod:扫描时间间隔,默认为60 seconds
debug:是否打印出logback的日志,默认为false
logback配置,当scan启用时,配置文件会定时检查并重新加载
property name:属性名
value:属性值
file:可以引入properties文件的属性
定义参数常量,可以使用${属性名}进行使用
springProperty name:属性名
source:取项目配置文件的属性源
scope:作用域
springBoot的扩展,将读取springBoot的配置文件,获取参数常量
appender name:自定义的策略名
class:指定输出策略的输出类,控制台输出或文件输出
输出策略
appender.file 此策略输出的文件路径,可以绝对路径,也可以相对路径
appender.rollingPolicy class:指定回滚策略类 日志输出回滚策略配置
appender.rollingPolicy.fileNamePattern 日志输出回滚的日志保存路径
appender.rollingPolicy.maxHistory 日志最大保存天数
appender.rollingPolicy.totalSizeCap 总日志最大的容量,指的不是单个文件
appender.encoder 编码策略
appender.encoder.pattern 指定输出的日志格式,控制台可以有颜色,但文件输出不行
appender.encoder.charset 编码格式,一般都取utf-8
appender.filter class:指定过滤器类
注意:每个过滤器,子节点都不完全相同,建议查看源码和官方文档,也可以实现自己的过滤器
日志输出的过滤策略
root level:指定日志等级 该项目所有包的等级,比此等级高的日志信息会显示
logger level:指定日志等级
name:指定的包名或类名
additivity:true/false,表示日志是否向上传递,如果为true,日志在root可能会再次打印
功能与root基本一致,区别在于
root是指定工程的所有包的,而logger需要自己指定包或类
root.appender-ref
logger.appender-ref
ref:指定定义的appender策略的名字 指定输出的策略
建议在最上层指定控制台,不然启动控制台就一个springBoot的Logo
springProfile springBoot的扩展,可以通过环境指定,实现标签内的内容

四、官方配置文档和git地址

功能:SpringBoot日志配置详情的更多相关文章

  1. SpringBoot Logback配置,SpringBoot日志配置

    SpringBoot Logback配置,SpringBoot日志配置  SpringBoot springProfile属性配置 ================================ © ...

  2. Springboot日志配置探索(主要看logback)(一)

    这篇博客是springboot日志配置探索的第一篇,主要讲默认配置下springboot的logback日志框架的配置(即直接使用是怎样的) 首先,是一个SpringBoot的有关日志的说明文档:ht ...

  3. (转)Springboot日志配置(超详细,推荐)

    Spring Boot-日志配置(超详细) 更新日志: 20170810 更新通过 application.yml传递参数到 logback 中. Spring Boot-日志配置超详细 默认日志 L ...

  4. springboot 日志配置

    maven依赖中添加了 spring-boot-starter-logging : <dependency> <groupId>org.springframework.boot ...

  5. springboot日志配置

    默认情况下,spring boot使用的是LogBack日志系统.在spring-boot-starter-web和spring-boot-starter中都已经默认依赖了logging的工具包. 如 ...

  6. SpringBoot日志配置(详解) 涉及控制台输出日志、生成日志文件、日志级别修改、hibernate日志不输出

    写在前面 本篇主要讲述日志配置,看完本篇可以解决下述问题, 控制台输出日志.生成日志文件.日志级别修改.hibernate日志不输出 Git Demo Path:https://github.com/ ...

  7. Springboot日志配置探索(主要看logback)(二)

    这篇博客主要是讲在Springboot中扩展的日志框架的配置,也是主要讲logback 8 继续看文档,这里讲到: springboot里面还有几个日志系统框架可以选择使用,你可以通过在classpa ...

  8. 微服务-springboot日志配置

    springboot 默认会加载classpath:logback-spring.xml文件. springProfile 中的name名字对应application-xx.properties 中的 ...

  9. ELK springboot日志收集

    一.安装elasticsearch 可以查看前篇博客 elasticsearch安装.elasticsearch-head 安装 二.安装 配置 logstash 1.安装logstash 下载地址: ...

随机推荐

  1. 微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法

    微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法 具体情况: scroll-view 滚动,设置 display:flex 不生效并警告设置 enable-fl ...

  2. 后端程序员之路 47、Hadoop hdfs

    Hadoop的核心是HDFS和MapReduce,而两者只是理论基础,不是具体可使用的高级应用,Hadoop旗下有很多经典子项目,比如HBase.Hive等,这些都是基于HDFS和MapReduce发 ...

  3. Docker 一次性进程与对话进程

    目录 一次性进程 对话进程 退出的方法 参考 Docker在运行程序的时候,需要区分运行的程序是一次性进程还是对话进程,不同的进程操作方式有差异. 一次性进程 一些简单进程是不需要交互的,比如hell ...

  4. 一文帮你搞懂 Android 文件描述符

    介绍文件描述符的概念以及工作原理,并通过源码了解 Android 中常见的 FD 泄漏. 一.什么是文件描述符? 文件描述符是在 Linux 文件系统的被使用,由于Android基 于Linux 系统 ...

  5. HDOJ-6656(数论+逆元)

    Kejin Player HDOJ-6656 设f[i]为从i升级到i+1期望需要的金钱,由于每级都是能倒退或者升级到i+1,所以询问从l,r的期望金钱可以直接前缀和,那么推导每一级升级需要的期望钱也 ...

  6. 【免费开源】基于Vue和Quasar的crudapi前端SPA项目实战—环境搭建 (一)

    背景介绍和环境搭建 背景 crudapi增删改查接口系统的后台Java API服务已经全部可用,需要一套后台管理UI,主要用户为开发人员或者对计算机有一定了解的工作人员,通过UI配置元数据和处理业务数 ...

  7. 2020年HTML5考试模拟题整理(一)

    1.哪个元素被称为媒体元素的子元素? 答案:<track>. <track> 标签为媒体元素(比如 <audio> and <video>)规定外部文本 ...

  8. 选择 FreeBSD 而不是 Linux 的技术性原因3

    选择 FreeBSD 而不是 Linux 的技术性原因3 jail FreeBSD Jails 系统是另一个惊人的工程壮举. 在 2000 年 3 月 14 日的 4.0 版本中,FreeBSD 引入 ...

  9. 滑动窗口解决最小子串问题 leetcode3. Longest Substring Without Repeating Characters

    问题描述: Given a string, find the length of the longest substring without repeating characters. Example ...

  10. Cable Protection

    题目大意:求一颗基环树的最小点覆盖. 题解:其实是一道比较板子的树形dp,dp[i][0/1]表示取或者不取i点的最小点.但是首先我们要把基环树断开,然后分别考虑a被覆盖和b被覆盖的情况. dp[i] ...