深入理解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>
日志级别的调整
日志级别决定了日志记录的详细程度。常见的日志级别有:
TRACE
DEBUG
INFO
WARN
ERROR
FATAL
(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…...

2024年入职/转行网络安全,该如何规划?_网络安全职业规划
前言 前段时间,知名机构麦可思研究院发布了 《2022年中国本科生就业报告》,其中详细列出近五年的本科绿牌专业,其中,信息安全位列第一。 网络安全前景 对于网络安全的发展与就业前景,想必无需我多言,作为…...

【Python系列】执行 Shell 命令的六种方法
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

2024华为OD机试真题-部门人力分配Python-C卷D卷-200分
【华为OD机试】-(C卷+D卷)-2024最新真题目录 目录 题目描述 输入描述 输出描述 用例1 考点 解题思路 代码 题目描述 部门在进行需求开发时需要进行人力安排。 当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单…...

【Leetcode 1436 】旅行终点站—— 哈希表
给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。 题目数据保证线路图会形成一…...

springboot自动配置原理-面试题
网络上看很多文章并没什么用,重点没说到,不知道从那里入手讲,刷到的直接按照下面这个,背出来就行了 1、当启动springboot应用程序的时候,会先创建SpringApplication的对象,在对象的构造方法中会进行某些参数…...

【C++题解】1140 - 亲密数对
欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1140 - 亲密数对 类型:自定义函数 题目描述: 键盘输入 N ,N 在 2 至 2000 之间,求 2 至 N 中的亲密数对,就是 A 的因子和…...

学习大数据DAY40 基于 hive 的数据处理
目录 Hive 复合数据定义方法 Hive 复合数据查询方法 hive 内置函数 上机练习 Hive 复合数据定义方法 Hive 复合数据查询方法 hive 内置函数 -- 查看系统自带的函数 show functions; -- 显示自带的函数的用法 desc function upper; -- 详细显示自带的函数的用法 desc …...

[数据集][目标检测]手钳检测数据集VOC+YOLO格式141张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):141 标注数量(xml文件个数):141 标注数量(txt文件个数):141 标注类别…...

SQL注入(head、报错、盲注)
目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 1. 报错注入 1.1 那么什么是报错注入呢? 1.2 报错注入原理 extractvalue函数 updatexml函数 1.3 靶场解析 靶场练习 2. HEAD注入 2.1 相关全局变量 2.2 靶场解析 burp暴力破解 靶场练习 3…...

30. 包含 min 函数的栈
comments: true difficulty: 简单 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9830.%20%E5%8C%85%E5%90%ABmin%E5%87%BD%E6%95%B0%E7%9A%84%E6%A0%88/README.md 面试题 30. 包含 min 函数的栈 题目描述 定义栈的数据结构ÿ…...