深入理解Spring Boot日志框架与配置
目录
- Spring Boot日志框架概述
- Spring Boot默认日志框架:Logback
- 日志配置文件
- 日志级别的调整
- 日志输出配置
- 日志格式化
- 日志轮转和归档
- 集成其他日志框架
- 日志管理工具
- 最佳实践
- 总结
Spring Boot日志框架概述
Spring Boot 支持多种日志框架,如 Logback、Log4j2 和 Java Util Logging (JUL)。其中,Logback 是 Spring Boot 默认使用的日志框架。Spring Boot 通过 spring-boot-starter-logging 依赖提供对这些日志框架的支持,并自动配置默认的日志设置。
常见的日志框架有:
- Logback
- Log4j2
- Java Util Logging (JUL)
- SLF4J (Simple Logging Facade for Java)
统一日志接口:SLF4J
SLF4J 是一个简单的日志门面,它为各种日志框架提供了统一的接口。开发者可以在代码中使用 SLF4J API,而在运行时选择具体的日志框架实现。Spring Boot 默认集成了 SLF4J,并使用 Logback 作为实际的日志实现。
Spring Boot默认日志框架:Logback
Logback 是由 Log4j 的作者开发的一个开源日志框架,具有性能高、灵活性强、易于配置等特点。Spring Boot 默认集成了 Logback,并提供了一些默认的配置。
默认配置
Spring Boot 的默认日志配置非常简单且易于理解。默认情况下,日志会输出到控制台,并使用以下格式:
%date{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
示例输出:
2024-08-09 12:34:56 [main] INFO com.example.demo.Application - Starting Application on localhost with PID 1234
日志配置文件
Spring Boot 支持多种格式的日志配置文件,包括 application.properties、application.yml 和原生的 Logback 配置文件 logback-spring.xml 或 logback.xml。
使用application.properties进行配置
在 application.properties 文件中,可以通过 logging 前缀来配置日志设置。例如:
# 设置日志级别
logging.level.root=INFO
logging.level.com.example=DEBUG# 配置日志文件
logging.file.name=logs/myapp.log# 配置日志文件大小和归档策略
logging.file.max-size=10MB
logging.file.max-history=30
使用logback-spring.xml进行配置
对于复杂的日志配置,可以使用 logback-spring.xml 或 logback.xml 文件。以下是一个简单的 logback-spring.xml 示例:
<configuration><property name="LOG_PATH" value="logs"/><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/myapp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="FILE" /></root>
</configuration>
日志级别的调整
日志级别决定了日志记录的详细程度。常见的日志级别有:
TRACEDEBUGINFOWARNERRORFATAL(Log4j2 特有)
日志级别是有层次的,从 TRACE 到 ERROR,记录的信息越来越少。可以在 application.properties 或 logback-spring.xml 文件中配置不同包或类的日志级别。
在application.properties中配置日志级别
# 设置根日志级别
logging.level.root=INFO# 设置特定包的日志级别
logging.level.com.example=DEBUG
logging.level.org.springframework.web=ERROR
在logback-spring.xml中配置日志级别
<logger name="com.example" level="DEBUG"/>
<logger name="org.springframework.web" level="ERROR"/>
日志输出配置
Spring Boot 允许将日志输出到不同的目标,如控制台、文件、数据库等。可以在 application.properties 或 logback-spring.xml 文件中进行配置。
输出到控制台
默认情况下,Spring Boot 会将日志输出到控制台。如果需要自定义控制台输出格式,可以在 logback-spring.xml 中配置 ConsoleAppender。
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender><root level="INFO"><appender-ref ref="STDOUT" />
</root>
输出到文件
将日志输出到文件,可以在 application.properties 中配置:
# 配置日志文件路径
logging.file.name=logs/myapp.log# 配置日志文件大小和归档策略
logging.file.max-size=10MB
logging.file.max-history=30
或者在 logback-spring.xml 中配置 RollingFileAppender:
<property name="LOG_PATH" value="logs"/><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/myapp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender><root level="INFO"><appender-ref ref="FILE" />
</root>
输出到数据库
将日志输出到数据库,可以在 logback-spring.xml 中配置 DBAppender。以下是一个将日志输出到MySQL数据库的示例:
<appender name="DB" class="ch.qos.logback.core.db.DBAppender"><connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource"><driverClass>com.mysql.cj.jdbc.Driver</driverClass><url>jdbc:mysql://localhost:3306/logdb</url><user>username</user><password>password</password></connectionSource><sql><![CDATA[INSERT INTO log_entries (timestamp, level, logger, message)VALUES (CURRENT_TIMESTAMP, %level, %logger, %message)]]></sql>
</appender><root level="INFO"><appender-ref ref="DB" />
</root>
日志格式化
日志格式化指的是日志输出的格式,可以通过配置来定义日志的显示样式。Spring Boot 使用Logback的PatternLayout来格式化日志。
在application.properties中配置日志格式
# 配置控制台日志格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n# 配置文件日志格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
在logback-spring.xml中配置日志格式
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/myapp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender>
日志轮转和归档
日志轮转和归档是指将日志文件按一定规则进行分割和存档,以防止日志文件过大。Logback 提供了灵活的日志轮转和归档策略。
时间轮转策略
时间轮转策略可以按时间段(如每天、每小时)分割日志文件。在 logback-spring.xml 中配置 TimeBasedRollingPolicy:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/myapp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender>
大小轮转策略
大小轮转策略可以按文件大小分割日志文件。在 logback-spring.xml 中配置 SizeBasedTriggeringPolicy:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/myapp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><fileNamePattern>${LOG_PATH}/myapp.%i.log</fileNamePattern><minIndex>1</minIndex><maxIndex>10</maxIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender>
集成其他日志框架
虽然 Spring Boot 默认使用 Logback,但它也支持其他日志框架,如 Log4j2 和 Java Util Logging (JUL)。可以通过替换 spring-boot-starter-logging 依赖来集成其他日志框架。
集成Log4j2
在 pom.xml 中添加 Log4j2 依赖,并排除 spring-boot-starter-logging 依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>
然后在 src/main/resources 目录下创建 log4j2-spring.xml 文件进行配置。
日志管理工具
在实际项目中,使用日志管理工具可以更方便地管理和分析日志数据。以下是一些常见的日志管理工具:
ELK Stack
ELK Stack 是由 Elasticsearch、Logstash 和 Kibana 组成的日志管理工具,可以用于集中化日志管理和分析。
- Elasticsearch:分布式搜索引擎,用于存储和搜索日志数据。
- Logstash:数据处理管道工具,用于收集、处理和转发日志数据。
- Kibana:数据可视化工具,用于可视化日志数据和创建仪表板。
Graylog
Graylog 是一个开源的日志管理平台,提供强大的日志收集、处理、存储和分析功能。
Splunk
Splunk 是一个企业级的日志管理和分析工具,提供丰富的功能和强大的数据处理能力。
最佳实践
使用统一的日志接口
使用 SLF4J 作为统一的日志接口,可以在不同的日志框架之间切换,而不需要修改应用程序代码。
合理设置日志级别
根据不同的环境(开发、测试、生产)合理设置日志级别。在开发环境中,可以设置较低的日志级别(如DEBUG),以便调试;在生产环境中,设置较高的日志级别(如INFO或WARN),以减少日志量。
定期清理日志文件
定期清理旧的日志文件,防止日志文件占用过多的磁盘空间。可以通过日志轮转和归档策略自动管理日志文件。
使用日志管理工具
使用日志管理工具集中化管理和分析日志数据,及时发现和解决问题。
总结
日志是应用程序的重要组成部分,通过合理的日志配置和管理,可以提高应用程序的可维护性和可靠性。Spring Boot 提供了丰富的日志框架支持和简化的配置方式,使得日志集成和配置变得非常简单。
本文详细介绍了Spring Boot中的日志框架与配置,包括常用的日志框架、日志配置文件的格式、日志级别的调整、日志输出配置、日志格式化、日志轮转和归档、集成其他日志框架以及日志管理工具。希望通过本文的介绍,读者能够深入理解Spring Boot的日志机制,并在实际项目中灵活应用这些知识。
相关文章:
深入理解Spring Boot日志框架与配置
目录 Spring Boot日志框架概述Spring Boot默认日志框架:Logback日志配置文件日志级别的调整日志输出配置日志格式化日志轮转和归档集成其他日志框架日志管理工具最佳实践总结 Spring Boot日志框架概述 Spring Boot 支持多种日志框架,如 Logback、Log4…...
WPF——动态排名图表实现
开发环境 VS2022 .NET 8.0 MVVM Toolkit 8.2.2 需求 开发中需要实现按照成绩动态指名,以展示当前的竞赛成绩的一个实时情况及变化。 即如下效果: 需求分析 按照接收到的信息,就是要将获取到的集合排序,并且要将排序前后的变…...
reactive() 的局限性
reactive() API 有一些局限性: 有限的值类型:它只能用于对象类型 (对象、数组和如 Map、Set 这样的集合类型)。它不能持有如 string、number 或 boolean 这样的原始类型。 不能替换整个对象:由于 Vue 的响应式跟踪是通过属性访问实现的&…...
stm32f407vet6驱动3.2寸lcd(9341 FSMC hal)
最近在钻研一些显示屏,研究到了lcd显示屏,然后入手了一块f407的开发板,但是店家给的资料有点怪,是keil4的工程,我一打开显示缺少f407vexxx,keil现在还巨慢,然后我到处找资料,发现网上大多是vgt6,又去各家ve…...
替换后的最长重复字符(LeetCode)
题目 给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。 在执行上述操作后,返回 包含相同字母的最长子字符串的长度。 解题 def characterReplacement(s, k):count {}max_len…...
[sqlserver][sql]sqlserver查询表信息和字段信息
--查询一个表中的所有字段 SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAMEzsyh_AccInfo --查询一个库下的所有表 select * from sysobjects where xtypeU --查询一个数据库下的所有字段 SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME in(select nam…...
easypoi模板导出word并且合并行
导出流程 引入依赖制作模板合并导出 引入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.2</version> </dependency>制作模板 合并行是备注那一列,这一列…...
雨云美国二区E5v2服务器测评(非广告)
注:本文非广告,非推广 本文长期更新地址: 雨云美国二区E5v2服务器测评(非广告)-星零岁的博客https://blog.0xwl.com/13594.html 今天来测评一下雨云美国二区v2服务器。我测试的这台配置是4-8, 35 M上传&a…...
前端form表单post请求
前端请求post,以表单的形式,后端传来的str,就是url携带的参数 const form document.createElement(form); form.style.display none; form.setAttribute(target, _blank); form.setAttribute(method, post); form.setAttribute(action,url); var vars …...
oracle共享池(shared pool):一、工作原理、组成部分 二、软硬解析过程
文章目录 oracle整体结构图共享池(shared pool)shared pool的作用shared pool的组成查询 shared pool 各组成部分大小硬解析和软解析 oracle整体结构图 共享池(shared pool) shared pool的作用 1、 将 sql 语句解析成执行计划 …...
设计模式六大原则中的里氏替换原则
设计模式六大原则中的里氏替换原则(Liskov Substitution Principle, LSP)是面向对象设计中一个至关重要的原则,它定义了继承的基本原则和约束,确保子类能够透明地替换父类,而不会破坏系统的正确性和稳定性。以下是对里…...
安装Cellpose
Cellpose是目前运用范围最广、效果最好的细胞分割模型,以下是安装方法。 3.1 安装cellpose 3.1.1 创建cellpose 打开Anaconda Navigator,如下图所示: 图3.1.1.1 Anaconda Navigator 依次点击 Environments、Create,在弹出的窗中࿰…...
图卷积神经网络算法
图神经网络 图卷积神经网络 GNN GCN 算法 咨询 图卷积神经网络(GCN) python D码,应用于节点分类。元学习,自监督学,transformer,lstm,cnn,bert,GAN,交通预测 …...
【C#】System.Text.Json
文章目录 主要特点使用场景基本用法序列化反序列化 自定义序列化与反序列化注意事项 System.Text.Json 是 .NET Core 3.0 及更高版本中引入的一个高性能的、低内存的 JSON 序列化与反序列化库。它是 .NET Core 和 .NET 5/6/7 等新版本中推荐的 JSON 处理方式,因为它…...
经典游戏,用java实现的坦克大战小游戏
今天给大家分享一个使用java编写的坦克大战小游戏,整体还是挺好玩的,通过对这款游戏的简单实现,加深对java基础的深刻理解。 一、设计思路 1.坦克大战小游戏通过java实现,其第一步需要先绘制每一关对应的地图,地图包括…...
linux开通端口命令
这块需要开通8088 8083 端口限制 查看已开放端口:sudo firewall-cmd --list-ports 开放8083端口:sudo firewall-cmd --add-port8088/tcp --permanent 开放8088端口:sudo firewall-cmd --add-port8083/tcp --permanent 移除端…...
5、并发锁机制之synchronized
并发锁机制之synchronized i/i--引起的线程安全问题分析原因分析i的JVM字节码指令i--的JVM 字节码指令结论 解决方案 synchronized的使用加锁方式使用synchronized解决之前的共享问题方式一方式二 synchronized底层实现原理分析查看synchronized的字节码指令序列重量级锁实现之…...
职场那些事:应对施暴者的智慧
在职场中,有些人用各种手段让你感到难受,让你屈服,甚至适应他们的变态心理。面对这种人,最重要的就是保持低调。🤐 很多同事选择倾诉,然而这其实是个大错特错。正如鲁迅所说,“同事间的悲欢并不…...
精细化管理和智慧化运营的智慧油站开源了。
AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用…...
vue项目配置基础路由vue-router
1、运行以下命令安装vue-router yarn add vue-router 2、在src目录下的components中新建两个vue页面 3、在src目录下新建router文件夹,在router文件夹下面新建index.js文件 4、配置main.js文件 //引入Vue import Vue from "vue"; //引入App import App…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
