6.3 SpringBoot日志进阶实战 Logback配置详解

news2024/11/25 23:58:04

CSDN成就一亿技术人

文章目录

  • 前言
  • 一、Logback入门级配置
  • 二、动态指定属性
  • 三、动态指定日志级别
  • 四、指定配置文件
  • 五、滚动记录RollingFIleAppender
  • 六、异步记录AsyncAppender
  • 总结
  • 最后


前言

在上一篇文章中,我和你介绍了SpringBoot快速入门Slf4j + Logback实战,遗留的问题是如何将日志输出到文件。

今天这篇文章分享了我在SpringBoot中使用Logback配置日志的经验和方法,并提供了详细的代码示例和解释,包括:滚动文件、异步日志记录、动态指定属性、日志级别、配置文件等常用功能,覆盖日常Logback配置开发90%的知识点!


一、Logback入门级配置

在tg-book-web的src\main\resources下创建logback-spring.xml文件,这里给出最简单的输出到控制台文件的示例

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<!-- 定义属性,可以通过“${}”来使用属性 -->
    <property name="LOG_PATH" value="d:/logs/"/>
    <property name="APP_ID" value="tg-book"/>

	<!-- 把日志输出到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern>
        </encoder>
    </appender>

	<!-- 把日志输出到文件 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <file>${LOG_PATH}/${APP_ID}.log</file>
    </appender>
    
    <!-- 大于等于info级别的才会输出 -->
    <root level="info">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>

</configuration>

上面的配置,将输出日志到文件d:/logs/tg-book.log中。

常用节点的解释:

  1. configuration:根节点,包含所有配置信息。
  2. property:定义属性,可以通过“${}”来使用属性
  3. appender:定义输出器的名称、类型、编码、日志输出路径等信息。
    • class=“ch.qos.logback.core.ConsoleAppender”:输出到控制台
    • class=“ch.qos.logback.core.FileAppender”:输出到文件
  4. root:定义日志记录器的根节点,指定默认的日志记录级别、输出器等信息。

二、动态指定属性

定义springProperty标签,通过指定source来源于application.properties的配置值!

  • 修改上面的logback-spring.xml文件,仅将property 标签注释,新增springProperty标签,如下:
<!--<property name="LOG_PATH" value="d:/logs/"/>
<property name="APP_ID" value="tg-book"/>-->
<springProperty name="LOG_PATH" source="log.path"/>
<springProperty name="APP_ID" source="app.id"/>
  • 修改application.properties文件,新增log.path和app.id配置:
app.id=tg-book
log.path=d:/logs/

三、动态指定日志级别

可以在application.properties文件中设置logging.level.包路径=日志级别来更改日志级别!

  • 例如,修改包org.tg.book.dal.mapper的日志级别=debug
logging.level.org.tg.book.dal.mapper = debug

此时,我们调用login接口,将输出debug级别的mybatis的sql日志,如下图:
在这里插入图片描述

  • 也可以修改root的日志级别
logging.level.root= warn

此时,所有包,将只输出warn、error级别日志。


四、指定配置文件

可以在application.properties文件中设置logging.config=classpath:logback-spring-2.xml来指定配置文件,如果不指定默认就是classpath:logback-spring.xml!


五、滚动记录RollingFIleAppender

RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个策略条件时,将日志记录到其余文件。

我们新增一个RollingFileAppender,并修改root的appender-ref,详细如下:

<!-- 把日志滚动输出到各文件 -->
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <encoder>
        <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <file>${LOG_PATH}/${APP_ID}-rolling.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>${LOG_PATH}/${APP_ID}-%d{yyyyMMdd}-%i.log</fileNamePattern> 
        <maxFileSize>100MB</maxFileSize> <!-- 文件最大大小,可能会超出 -->
        <maxHistory>30</maxHistory>  <!-- 保存30天 -->
        <totalSizeCap>10GB</totalSizeCap><!-- 总日志大小 -->
    </rollingPolicy>
</appender>

<root level="info">
     <appender-ref ref="STDOUT"/>
     <appender-ref ref="ROLLING_FILE"/>
</root>

SizeAndTimeBasedRollingPolicy是常用的滚动策略,配置节点说明如下:

  • maxFileSize:当D:\logs\tg-book-rolling.log文件达到100MB以后,会自动创建新文件!测试时,你可以指定maxFileSize小一点,比如100KB。
  • maxHistory:最大保存多长时间,单位是天
  • totalSizeCap:总日志大小

六、异步记录AsyncAppender

AsyncAppender可以将日志消息异步地发送到目标Appender,以提高应用程序的性能和响应速度。

我们新增两个AsyncAppender,一个指定控制台,一个指定文件,如下:

<!-- 把日志异步输出到控制台 -->
<appender name="ASYNC-STDOUT" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 指定队列满载时,消息将被丢弃的数量, 默认值为0 -->
    <discardingThreshold>0</discardingThreshold>
    <!-- 队列的大小, 默认值为256 -->
    <queueSize>1024</queueSize>
    <!-- 队列满了不阻塞调用者-->
    <neverBlock>true</neverBlock>
    <!-- 异步打印堆栈信息不丢失-->
    <includeCallerData>true</includeCallerData>
    <!-- 添加附加的appender,最多只能添加一个 -->
    <appender-ref ref="STDOUT"/>
</appender>

<!-- 把日志异步滚动输出到文件 -->
<appender name="ASYNC-FILE" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 指定队列满载时,消息将被丢弃的数量, 默认值为0 -->
    <discardingThreshold>0</discardingThreshold>
    <!-- 队列的大小, 默认值为256 -->
    <queueSize>1024</queueSize>
    <!-- 队列满了不阻塞调用者-->
    <neverBlock>true</neverBlock>
    <!-- 异步打印堆栈信息不丢失-->
    <includeCallerData>true</includeCallerData>
    <!-- 添加附加的appender,最多只能添加一个 -->
    <appender-ref ref="ROLLING_FILE"/>
</appender>

<!-- 大于等于info级别的才会输出 -->
<root level="info">
    <!--<appender-ref ref="STDOUT"/>
    <appender-ref ref="ROLLING_FILE"/>-->

    <appender-ref ref="ASYNC-STDOUT"/>
    <appender-ref ref="ASYNC-FILE"/>
</root>

AsyncAppender具有以下参数:

  • QueueSize:指定用于暂存消息的BlockingQueue队列的大小。默认值为256。

  • DiscardingThreshold:指定队列满载时,消息将被丢弃的数量。默认值为0。

  • NeverBlock:指定当队列已满时,是否阻止应用程序运行。如果设置为true,当队列已满时,应用程序将继续运行,但消息可能会丢失。默认值为false。

  • IncludeCallerData:指定是否在记录器中包含调用者信息。默认值为false。

  • AppenderRef:指定一个或多个目标Appender引用的列表。每个引用都必须引用一个已定义的Appender。

  • DiscardingThresholdPolicyClassName:指定当队列满时,应采取的策略类的名称。默认使用的是DiscardingThresholdPolicy类。

  • QueueFullPolicyClassName:指定当队列已满时,应采取的策略类的名称。默认使用的是DiscardingQueueFullPolicy类。


总结

最终的logback-spring.xml配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 定义属性,可以通过“${}”来使用属性 -->
    <!--<property name="LOG_PATH" value="d:/logs/"/>
    <property name="APP_ID" value="tg-book"/>-->
    <springProperty name="LOG_PATH" source="log.path"/>
    <springProperty name="APP_ID" source="app.id"/>

    <!-- 把日志输出到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern>
        </encoder>
    </appender>

    <!-- 把日志输出到文件 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <file>${LOG_PATH}/${APP_ID}.log</file>
    </appender>

    <!-- 把日志滚动输出到各文件 -->
    <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <file>${LOG_PATH}/${APP_ID}-rolling.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${APP_ID}-%d{yyyyMMdd}-%i.log</fileNamePattern>
            <maxFileSize>500KB</maxFileSize> <!-- 文件最大大小,可能会超出 -->
            <maxHistory>30</maxHistory>  <!-- 保存30天 -->
            <totalSizeCap>10GB</totalSizeCap><!-- 总日志大小 -->
        </rollingPolicy>
    </appender>


    <!-- 把日志异步输出到控制台 -->
    <appender name="ASYNC-STDOUT" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 指定队列满载时,消息将被丢弃的数量, 默认值为0 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 队列的大小, 默认值为256 -->
        <queueSize>1024</queueSize>
        <!-- 队列满了不阻塞调用者-->
        <neverBlock>true</neverBlock>
        <!-- 异步打印堆栈信息不丢失-->
        <includeCallerData>true</includeCallerData>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="STDOUT"/>
    </appender>

    <!-- 把日志异步滚动输出到文件 -->
    <appender name="ASYNC-FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 指定队列满载时,消息将被丢弃的数量, 默认值为0 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 队列的大小, 默认值为256 -->
        <queueSize>1024</queueSize>
        <!-- 队列满了不阻塞调用者-->
        <neverBlock>true</neverBlock>
        <!-- 异步打印堆栈信息不丢失-->
        <includeCallerData>true</includeCallerData>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="ROLLING_FILE"/>
    </appender>

    <!-- 大于等于info级别的才会输出 -->
    <root level="info">
        <!--<appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLING_FILE"/>-->

        <appender-ref ref="ASYNC-STDOUT"/>
        <appender-ref ref="ASYNC-FILE"/>
    </root>

</configuration>

application.properties增加配置:

#logging.config=classpath:logback-spring.xml
app.id=tg-book
log.path=d:/logs/
logging.level.root = info
#logging.level.org.tg.book.dal.mapper = debug

最后

不知道大家看的过不过瘾?

想要更多过瘾的好文章,给大家推荐一门专栏课程–>《基于SpringBoot+SpringCloud+Vue前后端分离项目实战》,由我和 前端狗哥 合力打造的一款专栏,可以让你从0到1快速拥有企业级规范的项目实战经验!

具体的优势、规划、技术选型都可以在《开篇》试读!

博主保证会用心持续高质量输出文章哦!

订阅专栏后也可以添加博主的微信,博主会为每一位用户进行针对性指导!

另外,别忘了关注我:天罡gg ,发布新文不容易错过: https://blog.csdn.net/scm_2008

老规矩,请投票给我反馈,谢谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据中心末端配电的数字化方案及设备选型

普通PDU和智能PDU有什么区别&#xff1f; 机架安装配电盘或机架配电单元 (PDU) 是一种配备许多插座的设备&#xff0c;可将电力分配给位于数据中心机架或机柜内的服务器、存储设备和网络设备。领先的分析公司 IHS 将它们分为两大类&#xff1a; 1) 基本 PDU 提供可靠的配电。 2…

【2023 · CANN训练营第一季】TIK C++算子开发入门 第一章——TIK C++算子开发入门

1.TIK C介绍 TIK C是一种使用C/C作为前端语言的算子开发工具&#xff0c;通过四层接口抽象、并行编程范式、孪生调试等技术&#xff0c;极大提高算子开发效率&#xff0c;助力AI开发者低成本完成算子开发和模型调优部署 使用TIK C开发自定义算子的优势&#xff1a; (1)C/C原语…

如何编写代码审查文档

一、前言 代码审查(Code Review)是开发流程中非常重要的一个环节&#xff0c;可以帮助发现并改正代码中的错误&#xff0c;提高代码质量&#xff0c;也是共享知识、熟悉代码的好机会。 最近功能开发完毕需要做代码审查&#xff0c;发现国内很多公司不强制要求编写代码审查文档…

【Linux内网穿透】】Linux本地搭建GitLab服务器 - 内网穿透远程访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自cpolar极点云文章&#xff1a;Linux搭建GitLab私有仓库&#xff0c;并内网穿透实…

chatgpt赋能python:Python的就业前景——解析云计算与Python的结合

Python的就业前景——解析云计算与Python的结合 Python是一种高级编程语言&#xff0c;具有高度的可读性和简洁性&#xff0c;并已成为Web和大数据的主流语言之一。Python广泛应用于数据科学&#xff0c;机器学习&#xff0c;Web开发&#xff0c;游戏开发和金融等领域&#xf…

Linux_epoll

Linux_epoll 思考:高效的餐厅服务如何实现?Epoll - Reactor 设计模式Epoll 与 Reactor 设计模式的关系Reactor优点Epoll - IO多路复用的用法web_server示例代码水平触发和边缘触发思考:高效的餐厅服务如何实现? 一个顾客来就餐,一个服务员在顾客点菜期间全程陪同服务! 一个…

并发编程总结

synchronized synchronized有如下3种使用方式 普通同步方法&#xff0c;锁是当前实例对象 静态同步方法&#xff0c;锁是当前类的class对象 同步方法块&#xff0c;锁是括号里面的对象 当一个线程访问同步代码块时&#xff0c;需要获得锁才能执行&#xff0c;当退出或者抛…

chatgpt赋能python:Python修改BIOS:一篇专业的SEO文章

Python修改BIOS&#xff1a;一篇专业的SEO文章 介绍 BIOS&#xff08;Basic Input/Output System&#xff09;是计算机中的核心程序&#xff0c;它负责启动电脑并管理硬件。一旦发现硬件问题&#xff0c;BIOS会通知用户或操作系统。它还可以设置系统的参数&#xff0c;例如时…

Node.js安装教程(npm搭建) - Window

择心】向大家介绍安装Node.js ( npm搭建 ) 一、安装流程 进入Node.js 去下载一个安装包。 双击下载好的应用程序,弹出安装界面并点击Next&#xff0c; 接受协议&#xff0c;点击Next&#xff0c; 更改默认安装路径&#xff0c;点击Next&#xff0c; 会默认添加到Path环境…

【每周一书】--(认知觉醒)思考:如何用清爽的情绪面对内卷的当下?

【每周一书】--&#xff08;认知觉醒&#xff09;思考&#xff1a;如何用清爽的情绪面对内卷的当下&#xff1f; 认知觉醒&#xff1a;开启自我改变的原动力焦虑&#xff1a;焦虑的根源完成焦虑定位焦虑选择焦虑环境焦虑难度焦虑 如何拥有清爽的情绪&#xff0c;释放焦虑情绪 认…

记录使用Pytorch分布式训练(torch.distributed)踩过的坑

引言 最近由于想加速神经网络模型训练&#xff0c;便开始着手学习pytorch的分布式训练&#xff08;DDP&#xff09;&#xff0c;结果踩了很多坑&#xff0c;在这里记录一下&#xff0c;便于以后查看&#xff0c;也同时分享给大家。 教程 我是通过下面几篇博客学习pytorch分布…

JVM类加载器及其详解

1.JVM加载过程分析 1.1加载流程图 1.2双亲委派机制 引导类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的核心类库&#xff0c;比如rt.jar、charsets.jar等扩展类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包应用程序…

chatgpt赋能python:Python倒序的实现方法介绍

Python倒序的实现方法介绍 Python是一种高级编程语言&#xff0c;被广泛用于数据处理、人工智能、Web开发等领域。其中&#xff0c;倒序是常见的一种操作需求。Python提供了多种实现倒序的方法&#xff0c;下面进行详细介绍。 1. 切片 切片是Python中常用的语法&#xff0c;…

chatgpt赋能python:Python倒序循环–优化你的编程效率

Python倒序循环 – 优化你的编程效率 在Python编程中&#xff0c;倒序循环是一种非常强大的操作。它可以用于遍历一个序列并对其中的元素进行逆序处理&#xff0c;从而提高编程效率。本文将介绍Python倒序循环的优势及如何在编程中使用。 什么是Python倒序循环 在传统循环中…

Web应用技术(第十五周/END)

本次练习基于how2j和课本&#xff0c;进行SSM的初步整合&#xff0c;理解SSM整合的原理、好处。 SSM整合应用 1.简单的实例项目&#xff1a;2.原理分析&#xff1a;3.浅谈使用SSM框架化&#xff1a; 1.简单的实例项目&#xff1a; how2j 2.原理分析&#xff1a; 具体见流程图…

MySQL-1-基础

MySQL 简介 mysql-server #提供服务 mysql-client #提供SQL命令 官网地址&#xff1a;https://dev.mysql.com/downloads/ https://downloads.mysql.com/archives/community/查看帮助文档 mysql> ? contents一、安装MySQL 1.1、二进制安装mysql5.7-linux 安装前准备 sh…

SpringBoot 的创建和使用

Spring Boot 的优点 Spring的出现是为了简化 Java 程序开发,而 SpringBoot 的出现是为了简化 Spring 程序开发. SpringBoot 就是 Spring脚手架 快速集成框架&#xff0c;Spring Boot提供了启动添加依赖的功能&#xff0c;用于秒级集成各种框架。内置运行容器&#xff0c;无需配…

python+vue大学新生入学报道交流平台pycharm

本系统的用户可分学生、教师、管理员三类。 管理员模块 1)登录&#xff1a;管理员输入用户名、密码&#xff1b;选择“管理员”角色&#xff1b;点击登录按钮。 2)管理员主界面&#xff1a;以管理员身份登录成功后&#xff0c;选择进入网站系统管理模块&#xff1b;选择进入首页…

Python字符串类型的使用

文章目录 Python中的字符串类型一、字符串的常用操作二、字符串的常用函数 Python中的字符串类型 注意&#xff1a;字符串为不可修改类型 python中没有单独的字符类型&#xff0c;字符就是长度为1的字符串。 通常创建字符串的方式&#xff1a;一般用单引号&#xff08;’ &am…

从数据库到固态硬盘的读取过程

应用程序到数据库到操作系统到固态硬盘 在我研究了从应用程序发送的简单 SQL 查询是如何最终存储到磁盘的过程中&#xff0c;我发现术语 “页&#xff08;page&#xff09;” 和 “块&#xff08;block&#xff09;” 可能是软件工程中最多用的概念之一。有数据库页&#xff08…