SpringBoot+logback实现日志记录写入文件

ops/2024/10/19 7:32:18/

前言
在实际的开发过程中,日志记录有着极其重要的作用,它帮助我们实现更高效的故障排查与调试、更及时的监控和性能优化、更全面的业务分析与决策支持…那么我们如何在SpringBoot项目中实现日志的个性化定制,以满足其他特殊需求呢?

工具logback+lombok

SpringBoot自身已经集成logback所以我们不需要再引入logback的依赖,如果是SpringBoot项目我们只需要引入lombok依赖

 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

编写logback-spring.xml配置文件
(springboot提倡我们使用-spring的日志配置文件)

<?xml version="1.0" encoding="UTF-8"?>
<configuration><property name="LOG_HOME" value="F:/logs"/><!--打印到控制台--><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d %-5level [%-18.18thread] - [%X{requestId:-SYSTEM}]:+++++++++ %msg%n</pattern></encoder></appender><appender name="download" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/%d{yyyyMMdd}.%i.log</fileNamePattern><maxHistory>7</maxHistory><maxFileSize>100MB</maxFileSize><totalSizeCap>2GB</totalSizeCap></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level - %msg%n</pattern></encoder></appender><!--    如果appender里没有限定日志如何区分,那么root可以统一设置,如果不配置那么控制台和文件不会输出任何日志,这里root的level不做限制--><root level="INFO"><appender-ref ref="stdout"/></root><!--下载日志--><logger name="download" level="DEBUG" additivity="false"><!--        输出到文件--><appender-ref ref="download"/><!--        允许控制台输出--><appender-ref ref="stdout"/></logger></configuration>

配置文件中appender是用于定义日志输出的目标。它负责将应用程序中产生的日志事件(log event)发送到指定的目的地,如控制台、文件、数据库以及内容格式、日志名称等。
property 元素:定义了一个名为 LOG_HOME 的属性,用于指定日志文件的存储路径。
appender 元素:
stdout appender:将日志输出到控制台。
download appender:将日志输出到文件,并使用滚动策略控制日志文件的大小和数量。
rollingPolicy 元素:定义了 download appender 的滚动策略,根据时间和文件大小来滚动日志文件。
encoder 元素:定义了日志格式,用于指定日志输出的格式,例如时间、日志级别、线程名、消息内容等。
root 元素:定义了根日志记录器,设置了日志级别为 INFO,并指定了输出到 stdout appender。
logger 元素:定义了名为 download 的特定日志记录器,设置了日志级别为 DEBUG,并指定了输出到 download appender 和 stdout appender。
fileNamePattern元素指定了日志文件的文件名

做完以上操作后,我们就能在项目中将日志记录输出到两个appender中。

java">Logger download =  LoggerFactory.getLogger("download");

在需要打印日志的类或者函数中new 一个logger对象,并且绑定配置文件中download这个logger。

java"> download.info("请求数据收到");download.info("请求数据成功:"+ftpFiles.length+"条数据");download.info("开始接收:" + k + ftpFile.getName());	download.info("接收完成:" + k + ftpFile.getName());download.info("tar文件接收异常:" + ftpFile.getName()+"操作已超时");download.info("接收完成");download.info("complete response");

输出日志时使用以上代码。
运行项目
在这里插入图片描述
配置文件中指定的日志路径出现日志文件
打开查看
在这里插入图片描述

以上


http://www.ppmy.cn/ops/38627.html

相关文章

win11安装SQL Server 2012 企业版

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、硬件要求二、软件安装参考&#xff1…

Taro 快速开始

大家好我是苏麟 , 今天聊聊Trao. 官网 : Taro 介绍 | Taro 文档 (jd.com) 点击快速开始 全局安装 CLI 初始化一个项目 选择配置 : 根据自己需求选择 安装失败先不用管 , 用前端工具打开项目 npm install 安装 , 显示安装失败 怎么解决 ? : 查看报错信息 百度 , 问 AI 工具 运…

Ali-Sentinel-Spring WebMVC 流控

归档 GitHub: Ali-Sentinel-Spring WebMVC 流控 测试 模块&#xff1a;sentinel-dashboard 先启动 DashboardApplication访问 http://localhost:8080/#/dashboard 登录&#xff1a;sentinel / sentinel 模块&#xff1a;sentinel-demo-spring-webmvc 在 WebMvcDemoApplicat…

SQL STRING_SPLIT函数,将指定的分隔符将字符串拆分为子字符串行

文章目录 STRING_SPLIT (Transact-SQL)1、语法2、参数3、样例样例1样例2 STRING_SPLIT (Transact-SQL) STRING_SPLIT 是一个表值函数&#xff0c;它根据指定的分隔符将字符串拆分为子字符串行。 1、语法 STRING_SPLIT ( string , separator [ , enable_ordinal ] ) 2、参数…

某度假村培训体系搭建项目成功案例纪实

——建立分层分类的培训体系&#xff0c;引入场景化培训&#xff0c;确保培训落到实处 【客户行业】文旅行业、酒店行业、文旅企业、度假村 【问题类型】培训体系搭建 【客户背景】 某度假村是一家集住宿、娱乐、健身等服务为一体的综合服务场所&#xff0c;度假村内部环境…

Linux(centos)安装 MySQL 8 数据库(图文详细教程)

前言 前几天写了个window系统下安装Mysql的博客&#xff0c;收到很多小伙伴私信需要Linux下安装Mysql的教程&#xff0c;今天这边和大家分享一下&#xff0c;话不多说&#xff0c;看教程。 一、删除以前安装的MySQL服务 一般安装程序第一步都需要清除之前的安装痕迹&#xff…

如何用opencv去掉单元格的边框线,以提高Tesseract识别率?

在OpenCV中处理从表格切割下来的图片&#xff0c;并去掉单元格的边框线&#xff0c;以提升Tesseract的识别准确率&#xff0c;确实是一个具有挑战性的任务。在这种情况下&#xff0c;我们需要采取一种策略来预处理图像&#xff0c;使得数字与背景之间的对比度增强&#xff0c;同…

算法随想录第二天打卡|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方 Python #最后反转列表 class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:left,right0,len(nums)-1new_nums[]while left<right:num1nums[left]**2num2nums[right]**2if num1<num2:new_nums.append(num2)right-1else:new_n…