Log4J、Log4J2和LogBack的历史故事
使用过Log4J和LogBack的同学肯定能发现这两个框架的设计理念极为相似使用方法也如出一辙。其实这个两个框架的作者都是一个人Ceki Gülcü俄罗斯程序员。Log4J 最初是基于Java开发的日志框架发展一段时间后作者Ceki Gülcü将Log4j捐献给了Apache软件基金会使之成为了Apache日志服务的一个子项目。 又由于Log4J出色的表现后续又被孵化出了支持C, C, C#, Perl, Python, Ruby等语言的子框架。然而伟大的程序员好像都比较有个性。Ceki Gülcü由于不满Apache对Log4J的管理决定不再参加Log4J的开发维护。“出走”后的Ceki Gülcü另起炉灶开发出了LogBack这个框架SLF4J是和LogBack一起开发出来的。LogBack改进了很多Log4J的缺点在性能上有了很大的提升同时使用方式几乎和Log4J一样许多用户开始慢慢开始使用LogBack。由于受到LogBack的冲击Log4J开始式微。终于2015年9月Apache软件基金业宣布Log4j不在维护建议所有相关项目升级到Log4j2。Log4J2是Apache开发的一个新的日志框架改进了很多Log4J的缺点同时也借鉴了LogBack号称在性能上也是完胜LogBack。性能这块后面我会仔细分析。那slf4j和这些有什么关系SLF4J的全称是Simple Logging Facade for Javaslf4j是门面模式的典型应用回答这个问题之前我们先看看如果需要用上面几个日志框架来打印日志一般怎么做具体代码如下java// 使用log4j需要log4j.jar import org.apache.log4j.Logger; Logger logger_log4j Logger.getLogger(Test.class); logger_log4j.info(Hello World!); // 使用log4j2需要log4j-api.jar、log4j-core.jar import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; Logger logger_log4j2 LogManager.getLogger(Test.class); logger_log4j2.info(Hello World!); // logback需要logback-classic.jar、logback-core.jar import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; Logger logger_logback new LoggerContext().getLogger(Test.class); logger_logback.info(Hello World!);从上面不难看出使用不同的日志框架就要引入不同的jar包使用不同的代码获取Logger。如果项目升级需要更换不同的框架那么就需要修改所有的地方来获取新的Logger这将会产生巨大的工作量。基于此我们需要一种接口来将不同的日志框架的使用统一起来这也是为什么要使用slf4j的原因。SLF4J即简单日志门面Simple Logging Facade for Java不是具体的日志解决方案它只服务于各种各样的日志系统。按照官方的说法SLF4J是一个用于日志系统的简单Facade允许最终用户在部署其应用时使用其所希望的日志系统。注意类似的日志门面还有Jakarta Common loggingJCL主要区别在于SLF4J是一个比较新的日志框架它更加灵活性能更好支持更多的日志实现而且JCL基于classLoader在运行时动态加载日志框架可能会产生很多意想不到的安全问题通过上面的介绍我们可以知道JCL和SLF4J都是日志门面Facade而Log4J、Log4J2和LogBack都是子系统角色SunSystem也就是具体的日志实现框架。他们的关系如下JUL是JDK本身提供的一种实现。SLF4J 的核心价值在于它提供了解耦设计​应用程序代码只依赖 slf4j-api而具体日志实现如 Logback、Log4j2可以在部署时动态绑定。这种架构使得项目升级或更换日志框架变得非常简单无需修改业务代码中的日志记录语句。slf4j怎么和日志框架结合使用使用slf4j后当我们在打印日志时就可以使用下面的方式javaimport org.slf4j.Logger; import org.slf4j.LoggerFactory; Logger logger LoggerFactory.getLogger(Test.class); logger.info(Hello World!)这又引入了另外一个问题slf4j如何决定使用哪个框架日志呢并且引入哪些jar包呢官方为我们准备了组合依赖slf4j logback slf4j-api.jar logback-classic.jar logback-core.jarslf4j log4j slf4j-api.jar slf4j-log412.jar log4j.jarslf4j jul slf4j-api.jar slf4j-jdk14.jar也可以只用slf4j无日志实现slf4j-api.jar slf4j-nop.jarSLF4J 的基本使用在代码中使用 SLF4J 非常简单首先需要通过 Maven 添加依赖xml!-- Maven 依赖配置 -- dependencies !-- SLF4J API -- dependency groupIdorg.slf4j/groupId artifactIdslf4j-api/artifactId version2.0.9/version /dependency !-- Logback Classic 实现 -- dependency groupIdch.qos.logback/groupId artifactIdlogback-classic/artifactId version1.4.11/version /dependency /dependencies在代码中获取 Logger 并记录日志javaimport org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ExampleService { // 获取Logger实例 private static final Logger logger LoggerFactory.getLogger(ExampleService.class); public void processUser(String userId) { logger.debug(Processing user: {}, userId); // 使用占位符避免字符串拼接 logger.info(User processing started); try { // 业务逻辑 logger.info(User {} processed successfully, userId); } catch (Exception e) { logger.error(Failed to process user: userId, e); // 记录异常信息 } } }SLF4J 的 ​参数化日志消息​使用{}占位符是其一个重要特性它不仅有更好的可读性还能提升性能——当日志级别高于当前配置时如配置为 INFO 级别时调用 debug 语句不会执行字符串拼接操作。Logback 架构与核心组件Logback 是 SLF4J 的原生实现框架由三个相互协作的模块组成每个模块都有独特的功能定位Logback 的模块化设计模块说明logback-core核心模块提供基础日志服务其他两个模块都依赖它logback-classic实现 SLF4J API完全兼容 SLF4J 接口同时兼容 Log4jlogback-access与 Servlet 容器集成用于 HTTP 访问日志记录Logback 相比 Log4j 有显著性能提升特别是在异步日志记录方面减少了线程阻塞和上下文切换开销。它还支持自动重载配置可以在不重启应用的情况下修改日志配置。Logback 核心概念Logback 架构基于三个核心概念Logger、Appender 和 Layout/Encoder。​Logger日志记录器​​采用层次化命名​如com.example.service.UserService具有继承性​子 Logger 继承父 Logger 的 Appender 和 Level通过LoggerFactory.getLogger()获取实例​Appender输出目的地​​Appender 负责将日志事件发送到不同目标Logback 支持多种 AppenderAppender 类型说明ConsoleAppender输出到控制台FileAppender输出到文件RollingFileAppender滚动文件按大小/时间SocketAppender发送到远程服务器SMTPAppender邮件告警KafkaAppender发送到 Kafka需扩展​Layout/Encoder格式化器​​定义日志输出格式常用占位符包括%d{yyyy-MM-dd HH:mm:ss.SSS}时间戳%level日志级别%thread线程名%logger{36}Logger 名缩写%msg日志消息%n换行符Logback 配置详解与案例Logback 支持 XML 和 Groovy 两种配置格式其中 XML 是最常用的方式。下面通过实际案例详细讲解 Logback 的配置。基础配置结构Logback 配置文件通常命名为logback.xml或logback-spring.xmlSpring 环境放置在src/main/resources/目录下。xml?xml version1.0 encodingUTF-8? configuration scantrue scanPeriod30 seconds !-- 定义变量 -- property nameLOG_HOME value./logs/ property nameAPP_NAME valuemyapp/ !-- 开发环境开关 -- springProfile namedev property nameLOG_LEVEL valueDEBUG/ /springProfile springProfile nameprod property nameLOG_LEVEL valueINFO/ /springProfile !-- 控制台输出 -- appender nameCONSOLE classch.qos.logback.core.ConsoleAppender encoder pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level %logger{36} - %msg%n/pattern /encoder /appender !-- 更多Appender配置 -- !-- 根日志器 -- root level${LOG_LEVEL:-INFO} appender-ref refCONSOLE/ /root !-- 特定包的日志级别 -- logger namecom.example.service levelDEBUG/ /configurationConsole Appender 配置Console Appender 用于将日志输出到控制台是开发环境中最常用的 Appenderxmlappender nameCONSOLE classch.qos.logback.core.ConsoleAppender encoder pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder !-- 过滤器只输出INFO及以上级别 -- filter classch.qos.logback.classic.filter.ThresholdFilter levelINFO/level /filter /appenderFile Appender 与滚动策略生产环境中通常需要将日志输出到文件并使用滚动策略防止文件过大xml!-- 滚动文件输出按天 -- appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender file${LOG_HOME}/${APP_NAME}.log/file rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy !-- 每天生成一个文件 -- fileNamePattern${LOG_HOME}/archive/%d{yyyy-MM-dd}/${APP_NAME}.%i.log.gz/fileNamePattern !-- 保留30天 -- maxHistory30/maxHistory !-- 单个文件最大100MB -- timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize100MB/maxFileSize /timeBasedFileNamingAndTriggeringPolicy /rollingPolicy encoder pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder /appender日志级别配置Logback 支持多个日志级别合理配置级别对系统性能和可观测性至关重要xml!-- 根日志器设置 -- root level${LOG_LEVEL:-INFO} appender-ref refCONSOLE/ appender-ref refFILE/ /root !-- 特定包/类级别设置 -- !-- 特定日志器将 com.example.service 包的日志级别设为 DEBUG且日志仅输出到文件不传递给根日志器避免控制台重复输出 -- logger namecom.example.service levelDEBUG additivityfalse appender-ref refFILE / /logger !-- 特定日志器将 org.springframework 包的日志级别设为 WARN减少不必要的日志输出 -- logger nameorg.springframework levelWARN /在这个配置中绝大多数日志遵循根的INFO级别设置。唯独com.example.service包下的日志可以输出DEBUG级别及以上的内容并且这些调试信息只写入文件不会出现在控制台因为additivityfalse。所有来自org.springframework包的日志只有WARN和ERROR级别才会被记录。根日志器 (root)​​ 和特定包/类日志器 (logger)​​ 的设置是日志配置的两个核心层面主要在于作用和范围的区别特性根日志器 (root)特定包/类日志器 (logger)​作用范围​​全局默认。影响所有未被特定logger明确配置的日志记录器。​局部特定。仅影响通过name属性指定的包或类及其子包/子类。​配置目的​设置应用程序的基础日志级别和输出策略。为特定模块提供更精细的日志控制如更详细或更严格的级别。​继承性​是所有日志器层次的根节点其他日志器默认继承其配置。从其父日志器可能是根或其他上层日志器​继承未被自身覆盖的设置。​常用级别​生产环境常设为INFO或WARN开发环境可设为DEBUG。根据需求灵活设置如将关注模块设为DEBUG将嘈杂的第三方库设为ERROR。Logback 支持的日志级别从低到高依次为TRACE最细粒度的信息通常只在开发过程中使用DEBUGlogger.debug信息INFOlogger.info 信息WARNlogger.warn 信息ERRORlogger.error 信息高级特性与性能优化Logback 提供了多种高级功能可以满足复杂场景下的日志需求。MDCMapped Diagnostic ContextMDC 用于在日志中添加上下文信息如请求 ID、用户 ID非常适合分布式系统跟踪

相关新闻

湖仓一体架构概览

湖仓一体架构概览

目录一、整体架构底座与分层逻辑二、端到端完整数据流1. 第一阶段:全量数据入湖(数据湖层)2. 第二阶段:数仓域分层加工(数据仓库层)3. 第三阶段:特征存储双链路加工(特征存储层&…

2026/7/1 1:36:55阅读更多 →
好用的亚洲汽美抛光赛事供应商

好用的亚洲汽美抛光赛事供应商

汽车美容行业正迎来爆发期,但不少从业者却陷入“技术内卷”的困局——天天埋头苦干,收入却上不去,想靠比赛镀金,又怕选了“水货”赛事白花钱。我们走访了超过200位一线技师,结合真实参赛数据和行业调研,为你…

2026/7/1 1:31:55阅读更多 →
浏览器中的专业SVG编辑器:如何用SVG-Edit解决矢量图形编辑难题

浏览器中的专业SVG编辑器:如何用SVG-Edit解决矢量图形编辑难题

浏览器中的专业SVG编辑器:如何用SVG-Edit解决矢量图形编辑难题 【免费下载链接】svgedit Powerful SVG-Editor for your browser 项目地址: https://gitcode.com/gh_mirrors/sv/svgedit 在当今数字设计领域,矢量图形编辑已成为设计师和开发者的核…

2026/7/1 1:31:55阅读更多 →
Java毕设选题推荐:基于 SpringBoot 的农户农产品展销助农平台的设计与实现 基于 SpringBoot 的智慧农商便民服务平台【附源码、mysql、文档、调试+代码讲解+全bao等】

Java毕设选题推荐:基于 SpringBoot 的农户农产品展销助农平台的设计与实现 基于 SpringBoot 的智慧农商便民服务平台【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/1 2:42:04阅读更多 →
分行业专业财会分组,金算盘精准匹配不同产业财税需求

分行业专业财会分组,金算盘精准匹配不同产业财税需求

不同行业经营模式、票据类型、申报规范差异较大,统一财会团队很难兼顾各行业细节,阿克苏金算盘财税按照行业划分专属财会小组,商贸、工程、农资、餐饮、加工行业分组专项对接,精准匹配行业专属财税需求,细分专业团队的…

2026/7/1 2:42:04阅读更多 →
Java计算机毕设之基于 SpringBoot 的农产品流通助农管理平台的设计与实现 基于 SpringBoot 的乡村农商数字化交易平台(完整前后端代码+说明文档+LW,调试定制等)

Java计算机毕设之基于 SpringBoot 的农产品流通助农管理平台的设计与实现 基于 SpringBoot 的乡村农商数字化交易平台(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/1 2:42:04阅读更多 →
【课程设计/毕业设计】基于 Java 的乡村振兴农产品电商服务平台的设计与实现 基于 Java 的智慧农商信息发布与交易平台【附源码、数据库、万字文档】

【课程设计/毕业设计】基于 Java 的乡村振兴农产品电商服务平台的设计与实现 基于 Java 的智慧农商信息发布与交易平台【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/1 2:42:04阅读更多 →
【毕业设计】基于 SpringBoot 的乡村振兴助农电商平台的设计与实现 基于 SpringBoot 的农商产品供需对接管理系统(源码+文档+远程调试,全bao定制等)

【毕业设计】基于 SpringBoot 的乡村振兴助农电商平台的设计与实现 基于 SpringBoot 的农商产品供需对接管理系统(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/1 2:42:04阅读更多 →
SeaweedFS:33000 Star 的分布式文件系统,小文件读写做到了极致

SeaweedFS:33000 Star 的分布式文件系统,小文件读写做到了极致

文章目录SeaweedFS:33000 Star 的分布式文件系统,小文件读写做到了极致架构设计:简单到只有一种思路性能数据兼容性做得不错云集成和分层存储部署有多简单跟其他方案的对比哪些场景适合用SeaweedFS:33000 Star 的分布式文件系统&a…

2026/7/1 2:37:04阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/30 4:03:30阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/30 4:36:27阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →