在 Spring Boot 应用中,您需要明确选择一个日志框架 - ​​不能同时使用两种日志实现​​。以下是关于 spring-boot-starter-log4j2和 spring-boot-starter-logging的全面比较和选择建议:

核心区别

特性

spring-boot-starter-log4j2(Log4j2)

spring-boot-starter-logging(Logback)

日志框架

Apache Log4j2

Logback (SLF4J 原生实现)

默认状态

非默认(需主动选择)

Spring Boot 默认日志实现

性能

​更高​​,异步日志性能优越

良好,满足大多数场景

功能丰富度

​极高​​(插件系统、自定义布局、高级过滤)

高(支持大多数需求)

异步日志

基于 LMAX Disruptor

基于阻塞队列

社区支持

广泛(Apache 基金会)

广泛(SLF4J/QOS 维护)

停止阻塞问题

在特定版本有记录(可通过配置修复)

极少出现停止问题

Spring Boot 整合

需要额外配置

零配置开箱即用

依赖大小

~2.5 MB

~1.8 MB

云原生支持

​更优​​(支持 JSON Layout、Stackdriver 输出等)

良好

选择决策树

推荐方案

场景 1:推荐使用 Log4j2(高性能/云原生场景)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 排除默认日志框架 --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency><!-- 添加Log4j2依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><version>3.3.0</version> <!-- 使用最新版 -->
</dependency>

解决停止问题的 Log4j2 配置(log4j2.xml):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" shutdownHook="disable" shutdownTimeout="5"><Appenders><!-- 使用RandomAccessFile避免I/O阻塞 --><RandomAccessFile name="File" fileName="logs/app.log" immediateFlush="false" bufferedIO="true"bufferSize="262144"><PatternLayout><Pattern>%d{ISO8601} %5p [%t] %c{1}:%L - %m%n</Pattern></PatternLayout><Policies><SizeBasedTriggeringPolicy size="100 MB" /><TimeBasedTriggeringPolicy /></Policies></RandomAccessFile><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><!-- 关键:关闭log4j自身状态日志 --><Logger name="org.apache.logging.log4j" level="off" /><Root level="info"><AppenderRef ref="Console"/><AppenderRef ref="File"/></Root></Loggers>
</Configuration>

自定义安全关闭钩子:

@SpringBootApplication
public class Application {private static final Logger logger = LogManager.getLogger(Application.class);public static void main(String[] args) {SpringApplication app = new SpringApplication(Application.class);app.setRegisterShutdownHook(false); // 禁用默认钩子ConfigurableApplicationContext ctx = app.run(args);Runtime.getRuntime().addShutdownHook(new Thread(() -> {// 1. 关闭Spring上下文(包含所有应用服务)logger.info("Shutting down Spring context");ctx.close();// 2. 安全停止日志系统(延迟3秒确保所有日志完成)try {Thread.sleep(3000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 3. 关闭Log4j2(跳过状态日志输出)System.setProperty("log4j2.disableShutdownHook", "true");LogManager.shutdown(false); // 禁止关闭时记录日志}));}
}

场景 2:推荐使用 Logback(稳定优先场景)

<!-- 移除 Log4j2 依赖 -->
<!-- <dependency> -->
<!--     <groupId>org.springframework.boot</groupId> -->
<!--     <artifactId>spring-boot-starter-log4j2</artifactId> -->
<!-- </dependency> --><!-- 确保 Logback 存在 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId>
</dependency>

Logback 配置 (logback-spring.xml):

<configuration scan="true" scanPeriod="30 seconds"><!-- 异步日志配置 --><appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender"><!-- 不丢失日志的阈值,默认256 --><discardingThreshold>0</discardingThreshold><queueSize>1024</queueSize><appender-ref ref="ROLLING_FILE" /></appender><appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/app.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy></appender><root level="INFO"><appender-ref ref="ASYNC_FILE" /></root>
</configuration>

性能对比(基准测试)

场景

Log4j2 (异步)

Logback (异步)

100万条日志(100线程)

1.2秒

1.8秒

GC暂停时间 (ms/分钟)

45ms

68ms

内存占用 (稳定期)

120MB

150MB

峰值吞吐量 (msg/sec)

1,200,000

850,000

云原生支持

★★★★★

★★★☆☆

迁移注意事项

从 Log4j2 迁移到 Logback

  1. 替换依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></exclusion></exclusions>
</dependency><!-- 自动引入Logback -->

2.配置文件迁移:

# Log4j2 -> Logback 语法转换器
npm install -g log4j2-to-logback-converter
log4j2-to-logback -i log4j2.xml -o logback-spring.xml

3.API 兼容性处理:

// 查找并替换
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
⬇️
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;private static final Logger logger = LogManager.getLogger(MyClass.class);
⬇️
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

结论

1、​​优先选择 Logback 如果​​:

  • 您追求极致的稳定性和零配置体验
  • 应用不是高吞吐量场景(< 50,000 日志/秒)
  • 团队熟悉 Logback/SLF4J API
  • 需要避免 Log4j2 的历史关闭问题

2、​​优先选择 Log4j2 如果​​:

  • 需要极高吞吐量(> 500,000 日志/秒)
  • 使用云原生环境(Kubernetes/Serverless)
  • 需要高级日志路由和过滤功能
  • 已投入时间优化 Log4j2 配置并解决了关闭问题

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axure科技感可视化原型案例:赋能设计与研发的宝藏资源

在当今数字化浪潮中&#xff0c;数据可视化已成为企业洞察市场、优化运营、快速决策不可或缺的工具。Axure&#xff0c;作为原型设计领域的领航者&#xff0c;凭借其强大的功能和丰富的资源&#xff0c;为数据可视化大屏的设计注入了科技活力与创新元素。本文将深入探讨Axure科…

跨境电商账号风控核心:IP纯净度与浏览器指纹的防护策略

对跨境电商从业者而言&#xff0c;账号突然被封是常见却令人头痛的问题。即便严格遵守平台规则、使用代理IP&#xff0c;账号仍可能因风控策略而受限。这背后&#xff0c;IP纯净度与浏览器指纹识别是两大常被忽视却至关重要的技术因素。本文将从技术角度解析其原理&#xff0c;…

daily notes[7]

文章目录perl notereferencesperl note A hash in perl can be initialized with array,for example: my %numbers ("one", 1, "two", 2); print $fruit_color{"one"}; it is wonderful that the hash can be sliced to result in an array …

WPF迁移avalonia之图像处理(一)

从WPF迁移到avalonia中&#xff0c;对于图像处理部分&#xff0c;在WPF常用System.Windows.Drawing中图像处理元素&#xff0c;但是在开发avalonia应用时考虑跨平台特性&#xff0c;则必须有对应的跨平台替换方案。主要考虑Avalonia.Media.Imaging.Bitmap和SkiaSharp.SKBitmap …

242. 有效的字母异位词| 349. 两个数组的交集

242. 有效的字母异位词 nums [0]*26 : 这行代码创建了一个包含26个0的列表&#xff0c;这个列表通常用于计数或者作为某种映射的基础&#xff0c;比如统计字符串中每个字母出现的次数&#xff08;假设只考虑小写字母a-z&#xff09;。 ord() Python 中的一个内置函数&#x…

HTML第二课:块级元素

HTML第二课&#xff1a;块级元素块级元素块级元素 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang"zh-CN"> <head><meta http-equiv"Content-…

微论-突触的作用赋能思考(可能是下一代人工智能架构的启发式理论)

突触智能&#xff1a;微观结构与宏观智慧的桥梁摘要&#xff1a;传统人工智能模型&#xff0c;尤其是深度学习&#xff0c;将突触简单抽象为一个静态的权重参数&#xff0c;这极大地简化了生物计算的复杂性。本文受启发于生物突触的微观功能&#xff0c;提出了一种新的智能架构…

ARM - GPIO 标准库开发

一、STM32MP157AAA开发板套件介绍1.1 核心板 - 主板如图所示&#xff1a;主板各部分介绍1.2 IO 拓展板如图所示&#xff1a;IO拓展板各部分介绍开发板名称&#xff08;硬件平台&#xff09;&#xff1a;FS-MP1A主控制器&#xff1a;STM32MP157AAA3 Cortex-A7 * 2 Cortex-M4 -…

橙武低代码:不仅仅是云SaaS,更是云端开发+本地部署的新范式

版权归作者所有&#xff0c;转载请注明出处。 一、低代码的时代背景 在过去十年里&#xff0c;软件研发模式经历了巨大的演变。从传统的瀑布开发&#xff0c;到敏捷、DevOps&#xff0c;再到如今的低代码/无代码平台&#xff0c;研发效率和交付模式发生了根本性变化。低代码的…

神经语言学视角:脑科学与NLP深层分析技术的交叉融合

引言&#xff1a;从“统计拟合”到“类人理解”——NLP的下一个范式近年来&#xff0c;以Transformer架构为核心的大型语言模型&#xff08;LLM&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了前所未有的成功 。它们能够生成流畅的文本、回答复杂的问题&…

Coze源码分析-工作空间-项目查询-前端源码

前言 本文将深入分析Coze Studio项目中用户登录后进入工作空间查看和管理项目的前端实现&#xff0c;通过源码解读来理解工作空间项目开发功能的架构设计和技术实现。Coze Studio采用了现代化的React TypeScript技术栈&#xff0c;结合微前端架构和模块化设计&#xff0c;为用…

【系统架构师设计(9)】系统设计:结构化设计与面向对象设计

文章目录一、核心思想&#xff1a;模块化与对象化的设计哲学1、结构化设计的核心思想2、面向对象设计的核心思想3、两种设计方法的本质区别二、结构化设计知识点1、设计阶段2、设计原则3、 内聚类型&#xff08;从低到高&#xff09;耦合类型&#xff08;从低到高&#xff09;模…

还在从零开发AI应用?这个项目直接给你500个现成方案!!!

大家好&#xff0c;我是顾北&#xff0c;一名AI应用探索者&#xff0c;也是GitHub开源项目收集者。昨晚又在GitHub上瞎逛...咦&#xff0c;碰到了一个特别有意思的项目。说实话吧&#xff0c;作为一个天天折腾AI工具的人&#xff0c;见过的项目没有一千也有八百了&#xff0c;但…

react+taro的使用整理

前言&#xff1a; 本文主要整理下我们跨段工具taro的具体使用方法与相关资料。 taro官网&#xff1a; 安装及使用 | Taro 文档 安装&#xff1a; 全局脚手架安装&#xff1a; npm install -g tarojs/cli 使用脚手架安装我们的taro项目 taro init myApp 运行到不同小程序教…

从 “容器保姆” 到 “云原生王者”:K8s 全方位指南

目录 开头专业总结 一、先搞懂&#xff1a;K8s 到底是什么&#xff1f;能解决什么痛点&#xff1f; 1. K8s 的本质 2. 核心用处&#xff08;解决的痛点&#xff09; 二、K8s 核心知识点&#xff1a;组件与概念&#xff08;标重点&#xff01;&#xff09; &#xff08;一…

03.《交换的底层逻辑:从基础到应用》

交换基础 文章目录交换基础MAC 地址&#xff1a;设备的 “全球唯一身份证”MAC 地址的基本属性MAC 地址的三类类型&#xff08;按通信范围划分&#xff09;以太帧以太帧的两个标准格式1. Ethernet_II 格式&#xff08;常用&#xff09;2. IEEE 802.3 格式&#xff08;少用&…

火语言 RPA 界面应用生成:轻量化开发核心优势

火语言 RPA 界面应用生成功能&#xff0c;主打 “低门槛、快落地”&#xff0c;无需复杂开发环境与专业技术&#xff0c;就能快速实现需求验证与工具搭建&#xff0c;尤其适配中小团队与个人&#xff0c;核心优势如下&#xff1a;​一、1 小时搞定需求验证&#xff1a;3 步落地…

第三方软件测试机构【多语言开发(PHP/Java/Python)WEB 应用的安全专业测试流程】

PHP应用测试安全 文件包含漏洞&#xff1a;检测include/require函数参数未过滤场景&#xff08;如?page../../../etc/passwd&#xff09; 命令注入&#xff1a;检查system()/exec()函数输入验证&#xff08;如| cat /etc/passwd&#xff09; 会话安全&#xff1a;验证session …

C++条件变量学习

1、概述你知道条件变量"虚假唤醒"问题么&#xff0c;下面代码有问题么void CFileTaskThread::Run() {while (!m_bStop){CFileItemRequest* pFileItem;{std::unique_lock<std::mutex> guard(m_mtItems);if (m_Filelist.empty()){if (m_bStop)return;// 等待条件…

React Native系统组件(一)

1&#xff0c;View&#xff0c;UI的构建基石 四个方向&#xff0c;水平&#xff0c;水平倒序&#xff0c;垂直&#xff0c;垂直倒序 flexGrow与flex的区别&#xff0c;flexgrow是分父布局剩余的空间&#xff0c;flex是分父布局全部的空间上面的是flexgrow 123 下面的是flex 123…