Spring Boot 日志配置
时间:2022-07-22
本文章向大家介绍Spring Boot 日志配置,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
日志功能需求
- 将关键数据打印在控制台
- 将关键数据打印在文件中
- 日志分类,根据日志不同类型打印到不同文件
- 不同的运行环境,打印不同的日志内容
- 日志自动压缩、自动清理
日志的门面: SLF4J
SLF4J
只是一个门面程序,并不做具体的日志打印功能,需要整合LogBack
、Log4j
等第三方模块。
- commons logging
- jboss logging
官方文档:http://www.slf4j.org/manual.html
测试Hello World
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class HelloSpringBoot {
Logger log = LoggerFactory.getLogger(HelloSpringBoot.class);
@RequestMapping("hello")
public String hello(){
log.info("Hello");
return "Hello SpringBoot";
}
}
输出
从上面的代码中我们可以看出,如果项目中需要使用到slf4j做日志输出的话,在每一个类里面都需要定义,过于繁琐,下面我们使用 lombok
插件来实现 slf4j
,可以极大的简化我们的代码量。
在项目 pom
文件中引入 lombok
依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
控制器
@RestController
@Slf4j
public class HelloSpringBoot {
@RequestMapping("hello")
public String hello(){
log.info("Hello");
return "Hello SpringBoot";
}
}
这里我们只需要在我们的类上引入一个@Slf4j
注解就可以实现slf4j日志输出功能。
自定义配置: LogBack
LogBack 特点
- 更快的实现
- 非常充分测试
- 非常充分文档
- 自动重新加载配置文件
- 自动压缩
- 自动去除旧的日志文件
配置 logback-spring.xml
线上环境记得修改日志的输出路径
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="5 seconds" debug="false">
<contextName>logback</contextName>
<!-- 配置日志输出路径(注:放到服务器上后记得更改路径) -->
<property name="log.split.path" value="D:\logs\logback_demo\" />
<!-- 配置日志名称 -->
<property name="log.path" value="logback.log" />
<!-- 配置切割后的debug日志输出路径 -->
<property name="log.debug.path" value="debug" />
<!-- 配置切割后的info日志输出路径 -->
<property name="log.info.path" value="info" />
<!-- 配置切割后的warn日志输出路径 -->
<property name="log.warn.path" value="warn" />
<!-- 配置切割后的error日志输出路径 -->
<property name="log.error.path" value="error" />
<!-- 配置日志文件最大数量 -->
<property name="log.file.max.num" value="30" />
<!-- 配置日志文件大小最大值 -->
<property name="log.file.max.size" value="50MB" />
<!-- 配置总日志文件大小最大值 -->
<property name="log.file.total.max.size" value="2GB" />
<!-- 输出到控制台 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--配置输出日志为彩色-->
<pattern>%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) - %cyan(%msg%n)</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 配置debug级别日志 -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 配置日志级别过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 配置日志存放路径 -->
<file>${log.split.path}${log.debug.path}/${log.path}</file>
<!-- 配置日志切割器 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 配置日志切割策略:每天切割 -->
<fileNamePattern>${log.split.path}${log.debug.path}/log_debug_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 配置日志数量 -->
<maxHistory>${log.file.max.num}</maxHistory>
<!-- 配置单个日志大小的最大值 -->
<maxFileSize>${log.file.max.size}</maxFileSize>
<!-- 配置总日志大小的最大值 -->
<totalSizeCap>${log.file.total.max.size}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置info级别日志 -->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 配置日志级别过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 配置日志存放路径 -->
<file>${log.split.path}${log.info.path}/${log.path}</file>
<!-- 配置日志切割器 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 配置日志切割策略:每天切割 -->
<fileNamePattern>${log.split.path}${log.info.path}/log_info_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 配置日志数量 -->
<maxHistory>${log.file.max.num}</maxHistory>
<!-- 配置单个日志大小的最大值 -->
<maxFileSize>${log.file.max.size}</maxFileSize>
<!-- 配置总日志大小的最大值 -->
<totalSizeCap>${log.file.total.max.size}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置warn级别日志 -->
<appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 配置日志级别过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 配置日志存放路径 -->
<file>${log.split.path}${log.warn.path}/${log.path}</file>
<!-- 配置日志切割器 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 配置日志切割策略:每天切割 -->
<fileNamePattern>${log.split.path}${log.warn.path}/log_warn_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 配置日志数量 -->
<maxHistory>${log.file.max.num}</maxHistory>
<!-- 配置单个日志大小的最大值 -->
<maxFileSize>${log.file.max.size}</maxFileSize>
<!-- 配置总日志大小的最大值 -->
<totalSizeCap>${log.file.total.max.size}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置error级别日志 -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 配置日志级别过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 配置日志存放路径 -->
<file>${log.split.path}${log.error.path}/${log.path}</file>
<!-- 配置日志切割器 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 配置日志切割策略:每天切割 -->
<fileNamePattern>${log.split.path}${log.error.path}/log_error_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 配置日志数量 -->
<maxHistory>${log.file.max.num}</maxHistory>
<!-- 配置单个日志大小的最大值 -->
<maxFileSize>${log.file.max.size}</maxFileSize>
<!-- 配置总日志大小的最大值 -->
<totalSizeCap>${log.file.total.max.size}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日志级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL -->
<root level="info">
<!-- 控制台日志 -->
<appender-ref ref="console" />
<!-- 按级别输出到对应文件 -->
<appender-ref ref="debug" />
<appender-ref ref="info"/>
<appender-ref ref="warn"/>
<appender-ref ref="error" />
</root>
</configuration>
配置 application.yml
spring:
profiles:
active: dev
logging:
path: D:/demolog # 设置日志储存位置
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Java——类与对象(基本概念、定义、内存分析、引用传递)
- Java——Stream数据流
- JavaWeb——MyBatis框架之连接池原理、MyBatis事务提交设置、动态SQL语法总结
- 8种ETL算法归纳总结,看完这些你就全明白了
- JavaWeb——Maven基础之详细总结,从零开始搭建Maven工程,包含一些常见的坑org.eclipse.jdt.internal.compiler.classfmt.ClassFormatEx
- JavaWeb——Redis数据库之Jedis操作5种类型数据的使用总结与前端Ajax获取Redis缓存数据的案例实战(结合了MySQL数据库)
- Java——数据库编程JDBC之快速入门吐血总结及各关键对象详解(提供了JDBCUtils工具类)
- MySQL数据库——事务的操作(开启、回滚、提交)、特征、隔离级别基础总结
- MySQL数据库——数据库的设计(多表之间的关系与三大范式)与备份还原
- JavaWeb——JSP入门学习(JSP基本概念、JSP脚本、JSP内置对象)
- MySQL数据库——数据库CRUD之基本DML增删改表操作及DQL查表操作
- JavaWeb——AJAX异步技术实现方式与案例实战(原生的JS方式、使用JQuery方式)
- JavaWeb——一文带你入门Servlet(生命周期、注解配置方法、IDEA与tomcat的相关配置)
- JavaWeb——JQuery之基础案例实战(实现表格隔行换色、实现全选全不选、QQ表情选择、下拉列表选中条目左右选择功能)
- JavaWeb——JQuery之DOM操作应用及实践案例总结(DOM内容操作、DOM属性操作、CRUD操作)