使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
在开发 Spring Boot 项目时,日志是调试和监控的重要工具。Spring Boot 默认支持 Logback 作为日志系统,并提供了 logback.xml
和 logback-spring.xml
两种配置方式。这篇文章将详细介绍这两者的区别、各自的优缺点以及最佳实践。
目录
- 一、什么是 Logback?为什么选择它?
- 二、`logback.xml` 与 `logback-spring.xml` 有什么区别?
- 1. Spring Boot 集成支持
- 2. 属性注入支持
- 3. `<springProfile>` 标签支持
- 4. 自动重启与热加载支持
- 5. 加载优先级
- 三、什么时候使用 `logback-spring.xml` 或 `logback.xml`
- 使用 `logback-spring.xml` 的场景
- 使用 `logback.xml` 的场景
- 四、最佳实践:如何使用 `logback-spring.xml` 设置多环境日志路径
- 1. 在 `application.yml` 中定义日志路径
- 2. 在 `logback-spring.xml` 中使用日志路径
- 3. 启动不同环境
- 五、总结
一、什么是 Logback?为什么选择它?
Logback 是 Java 应用的流行日志框架,以其高性能和丰富的功能在企业级项目中广泛应用。Logback 主要支持控制台和文件日志输出,支持文件滚动(按时间或大小分割日志),并支持自定义日志格式,帮助开发者有效记录和管理日志。
二、logback.xml
与 logback-spring.xml
有什么区别?
在 Spring Boot 项目中,可以使用 logback.xml
或 logback-spring.xml
文件来配置日志输出。但这两者虽然都属于 Logback 配置文件,却有不同的用法和特性:
1. Spring Boot 集成支持
logback-spring.xml
是专门为 Spring Boot 提供的日志配置文件,允许使用 Spring Boot 特有的功能,比如 Spring 配置的属性注入、基于 Profile 的配置切换等。logback.xml
是标准的 Logback 配置文件,缺少 Spring Boot 特有的集成支持功能,不能直接读取 Spring 配置中的属性。
2. 属性注入支持
-
logback-spring.xml
支持通过 Spring 的${}
占位符引入application.yml
或application.properties
中定义的属性。例如,日志文件的存储路径可以直接在logback-spring.xml
中通过 Spring 配置读取:# application.yml logging:path: /var/log/myapp
<!-- logback-spring.xml --> <property name="log.path" value="${logging.path}" />
-
logback.xml
不支持 Spring 的${}
占位符,也无法直接读取 Spring 配置文件中的属性,因此需要手动设置日志路径等参数。
3. <springProfile>
标签支持
-
logback-spring.xml
支持使用<springProfile>
标签,根据不同的 Spring Profile(如dev
、prod
)动态加载不同的日志配置,方便管理多环境日志。例如:<springProfile name="dev"><property name="log.path" value="/dev/logs" /> </springProfile><springProfile name="prod"><property name="log.path" value="/prod/logs" /> </springProfile>
-
logback.xml
不支持<springProfile>
标签,无法实现基于 Profile 的日志配置切换。
4. 自动重启与热加载支持
logback-spring.xml
支持 Spring Boot DevTools 的热加载,当修改logback-spring.xml
文件时,Spring Boot 可以自动重启并应用新的日志配置。logback.xml
虽然也支持热加载,但主要依赖 Logback 自身的配置文件监控,Spring Boot 的 DevTools 热加载不会生效。
5. 加载优先级
logback-spring.xml
在 Spring Boot 启动时优先加载。Spring Boot 会首先检测logback-spring.xml
,如果存在,则优先使用它作为日志配置文件。logback.xml
作为标准配置文件,如果项目中没有logback-spring.xml
,Spring Boot 才会加载logback.xml
。
三、什么时候使用 logback-spring.xml
或 logback.xml
使用 logback-spring.xml
的场景
- 需要读取 Spring 配置:如果需要从
application.yml
或application.properties
文件中读取日志配置,比如日志文件路径或日志级别,推荐使用logback-spring.xml
。 - 需要按环境配置日志:使用
<springProfile>
标签可以让不同环境(开发、测试、生产)加载不同的日志配置,适合多环境部署的项目。 - 需要自动重启和热加载:在开发中,
logback-spring.xml
可以支持 Spring Boot DevTools 的热加载功能,修改后立即生效,提高开发效率。
使用 logback.xml
的场景
- 标准的 Logback 项目:如果项目不是基于 Spring Boot 或者希望使用标准的 Logback 配置文件,使用
logback.xml
即可。 - 简单的日志配置:如果没有多环境需求,或不需要从 Spring 配置中读取属性,
logback.xml
足够满足基本的日志需求。
四、最佳实践:如何使用 logback-spring.xml
设置多环境日志路径
以下是通过 logback-spring.xml
配合 application.yml
设置多环境日志路径的示例:
1. 在 application.yml
中定义日志路径
# application.yml
spring:profiles:active: devlogging:path: /default/logs # 默认路径---# application-dev.yml
logging:path: /dev/logs---# application-prod.yml
logging:path: /prod/logs
2. 在 logback-spring.xml
中使用日志路径
<!-- logback-spring.xml -->
<configuration><!-- 读取 Spring 配置文件中的日志路径 --><property name="log.path" value="${logging.path}" /><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 文件输出 --><appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-info.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="console" /><appender-ref ref="file_info" /></root>
</configuration>
3. 启动不同环境
使用 spring.profiles.active
参数来切换日志路径:
- 开发环境启动:
java -Dspring.profiles.active=dev -jar your-app.jar
- 生产环境启动:
java -Dspring.profiles.active=prod -jar your-app.jar
五、总结
logback-spring.xml
是 Spring Boot 项目中的最佳选择,支持 Spring 配置读取、基于环境的配置切换、热加载等功能,适合多环境部署的项目。logback.xml
适用于标准的 Logback 项目,配置更为通用,但缺少 Spring Boot 的一些特性支持。- 通过结合
application.yml
与logback-spring.xml
,可以根据环境设置不同的日志路径,便于日志管理和问题排查。
希望通过这篇文章,你能更好地理解和运用 Logback,提升日志管理效率。
相关文章:
使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
在开发 Spring Boot 项目时,日志是调试和监控的重要工具。Spring Boot 默认支持 Logback 作为日志系统,并提供了 logback.xml 和 logback-spring.xml 两种配置方式。这篇文章将详细介绍这两者的区别、各自的优缺点以及最佳实践。 目录 一、什么是 Logbac…...

NSET or MSET算法--原理解析
1.背景 NSET/MSET是一种非线性的多元预测诊断技术,广泛应用于系统状态估计、故障诊断和预测等领域;相比于传统的线性模型和方法,NSET/MSET能够更好地处理非线性系统,并提供更准确的预测和诊断能力。在早期,MSET融合了…...

NC6 系统配置的消息渠道配置配置涉及相关的表,用户使用admin登录
NC6 系统配置的消息渠道配置配置涉及相关的表 --电子邮件、公共短信属性值配置表,比如邮箱类型、邮件发送服务器、用户、密码、发件人地址、url等。 SELECT * FROM sm_msg_stypeprop;--消息发送方式配置:电子邮件,公共短信。 SELECT * FROM sm_msg_stypebase WHERE active …...
PXC数据库性能测试对比
mysql单机 #初始化测试数据 sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=xxx.xxx.xxx.xxx --mysql-db=test --mysql-user=hzhadmin --mysql-password=Admi --tables=10 --table-size=1000000 prepare#运行性能测试 sysbench /usr/share/sysbench/oltp_rea…...
使用AutoMySQLBackup 数据库自动备份
1.下载地址 AutoMySQLBackup的下在地址为http://sourceforge.net/projects/automysqlbackup/ 。 目前最新版本为automysqlbackup-v3.0_rc6.tar.gz 2.解压缩 把下载的automysqlbackup-v3.0_rc6.tar.gz文件拷贝到/usr/tmp下面 在/usr/local下面新建一个automysqlbackup文件夹…...

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储
随着云计算技术的日益成熟,越来越多的企业开始将其业务迁移到云端,以享受更为灵活、高效且经济的服务模式。在视频监控领域,云存储因其强大的数据处理能力和弹性扩展性,成为视频数据存储的理想选择。NVR批量管理软件/平台EasyNVR&…...
13.React useTimeout
在 React 应用中,延迟执行某些操作是一个常见需求。传统的 setTimeout 在函数组件中使用可能会导致一些问题,如闭包陷阱或难以正确清理。useTimeout 钩子提供了一种声明式的方法来实现延迟执行,使得定时器的管理更加简单和可靠。这个自定义钩子不仅简化了定时器的使用,还解…...
Android待机问题与内存泄露日志定位及bugreport获取分析
文章目录 bugreportbugreport介绍获取bugreport日志分析bugreport安卓平台log获取日志android.logkernel.logkernel.log查看待机过程sysinfo.log判断内存是否有泄露分析bugreport,定位唤醒源,判断是否有ANR。分析安卓log,定位待机唤醒功耗问题,判断是否有内存泄露。bugrepo…...

访问控制技术原理与应用
目录 访问控制概述实现访问控制目标访问控制参考模型常见访问控制模型访问控制模型-DAC自主访问控制访问控制模型-MAC强制访问控制访问控制模型-RBAC基于角色的访问控制访问控制模型-ABAC基于属性的访问控制 访问控制概述 访问控制是对资源对象的访问授权控制的方法以及运行机…...
详解Rust标准库:Vec向量
查看本地官方文档 安装rust后运行 rustup doc查看The Standard Library即可获取标准库内容 std::vec::Vec定义 Vec除了可以作为动态数组还可以模拟为一个栈,仅使用push、pop即可 Vec默认分配在堆上,对于一个容量为4,有两个元素a、b的向量…...

网络原理(初一,TCP/IP五层(或四层)模型面试问题)
TCP/IP五层(或四层)模型 TCP/IP是⼀组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。 TCP/IP通讯协议采⽤了5层的层级结构,每⼀层都呼叫它的下⼀层所提供的⽹络来完成⾃⼰的需求。 • 应⽤层:负责…...

Unity引擎材质球残留贴图引用的处理
大家好,我是阿赵。 这次来分享一下Unity引擎材质球残留贴图引用的处理 一、 问题 在使用Unity调整美术效果的时候,我们很经常会有这样的操作,比如: 1、 同一个材质球切换不同的Shader、 比如我现在有2个Shader,…...
Flutter鸿蒙next中封装一个列表组件
1. 创建Flutter项目 首先,确保你已经安装了Flutter SDK,并创建一个新的Flutter项目: flutter create podcast_app cd podcast_app2. 封装列表组件 我们将在lib目录下创建一个新的文件,命名为podcast_list.dart,用于…...

层次与网络的视觉对话:树图与力引导布局的双剑合璧
目录 目的内容树图绘制目的步骤参考代码结果与分析 力引导布局算法目的参考代码结果与分析 总结 目的 掌握常用可视化软件与工具:学习和熟练使用常用的数据可视化软件和工具,如Matplotlib、Seaborn、Plotly、Tableau等。这些工具提供了用于创建图表、图…...

python将数据集中所有文件名升序制作txt文件(医学影像)
import os import re # 设定图像文件所在的路径 img_path ./2d/images/ #需修改路径 # 获取该路径下的所有文件名 img_list os.listdir(img_path) # 过滤出以.nii结尾的文件名 nii_list [f for f in img_list if f.endswith(.nii)] # 使用正则表达式从文件名中提…...

【The Art of Unit Testing 3_自学笔记06】3.4 + 3.5 单元测试核心技能之:函数式注入与模块化注入的解决方案简介
文章目录 3.4 函数式依赖注入技术 Functional injection techniques3.5 模块化依赖注入技术 Modular injection techniques 写在前面 上一篇的最后部分对第三章后续内容做了一个概括性的梳理,并给出了断开依赖项的最简单的实现方案,函数参数值注入法。本…...

【VSCode】配置
安装插件 C vscode-icons gdb调试 https://www.bilibili.com/video/BV15U4y1x7b2/?spm_id_from333.999.0.0&vd_sourcedf0ce73d9b9b61e6d4771898f1441f7f https://www.bilibili.com/video/BV1pU4y1W74Z?spm_id_from333.788.recommend_more_video.-1&vd_sourcedf0…...
Linux 常用命令整理大全及命令使用心得
本文章是为了总结自己用过的命令,以及一些心得,网上有很多类似的,但自己总结才能更好的理解。 文章目录 一、文件和目录管理01、 ls :列出目录内容02、cd:更改当前目录03、pwd:显示当前工作目录04、mkdir&a…...
计算器的实现
计算器的⼀般实现 计算器的一般实现:优化:使⽤函数指针数组的实现: 计算器的一般实现: #include <stdio.h> int add(int a, int b) {return a b; } int sub(int a, int b) {return a - b; } int mul(int a, int b) {retur…...

这个工具帮你快速实现数据集成和同步
在这个信息爆炸的时代,数据的流动和同步逐渐成为企业运营的命脉。然而,企业正面临着前所未有的数据挑战,无论是跨地域的分公司协作,还是云服务与本地数据库的交互,数据的集成、清洗、转换和加载(ETL&#x…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...