日志-Log4j,Logback日志框架的结构原理-元一软件
前言本篇文章记录对Log4jLogbackLog4j2和Slf4j日志框架的结构原理的学习。正文一. 整体结构如果单独使用Log4jLogbackLog4j2日志框架来进行日志打印那么使用方式可以如下所示。Log4jimport org.apache.log4j.Logger; public class Log4jTest { private static final Logger logger_log4j Logger.getLogger(Log4jTest.class); public static void main(String[] args) { logger_log4j.info(Test Log4j info.); logger_log4j.warn(Test Log4j warn.); logger_log4j.error(Test Log4j error.); } }单独使用Log4j时需要引入的依赖如下。dependency groupIdlog4j/groupId artifactIdlog4j/artifactId version1.2.16/version /dependency只需要引入上述依赖就可以使用Log4j进行日志打印但是如果要将Log4j与Slf4j进行整合使用还需要引入下述桥接包。dependency groupIdorg.slf4j/groupId artifactIdslf4j-log4j12/artifactId version1.7.25/version /dependencyLogbackimport org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogbackTest { private static final Logger logger_logback LoggerFactory.getLogger(LogbackTest.class); public static void main(String[] args) { logger_logback.info(Test Logback info.); logger_logback.warn(Test Logback warn.); logger_logback.error(Test Logback error.); } }Logback单独使用时只需要引入下述依赖。dependency groupIdch.qos.logback/groupId artifactIdlogback-classic/artifactId version1.2.3/version /dependency dependency groupIdch.qos.logback/groupId artifactIdlogback-core/artifactId version1.2.3/version /dependencyLog4j2import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Log4j2Test { private static final Logger logger_log4j2 LogManager.getLogger(Log4j2Test.class); public static void main(String[] args) { logger_log4j2.info(Test Log4j2 info.); logger_log4j2.warn(Test Log4j2 warn.); logger_log4j2.error(Test Log4j2 error.); } }单独使用Log4j2时需要引入的依赖如下。dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-core/artifactId version2.17.1/version /dependency dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-api/artifactId version2.17.1/version /dependency同理如果需要与Slf4j进行整合使用那么还需要引入下述桥接包。dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-slf4j-impl/artifactId version2.17.1/version /dependency无论使用哪种日志框架核心的抽象概念都为LoggerAppender和Formatter其中Logger提供日志打印行为Appender配置日志的打印位置Formatter配置日志的打印格式这三者的抽象类图可以由下述类图描述。由于Log4j和Log4j2无法满足Slf4j定义的接口所以为了在不修改已有代码的情况下还能提供对Slf4j定义的接口的实现Log4j和Log4j2还需要引入桥接包才能和Slf4j进行整合使用。整个结构可以用下图进行概括。二. 源码简析本小节将从LoggerFactory.getLogger(类.class)出发分析Slf4j是如何决定使用哪种日志框架的。LoggerFactory的getLogger()方法如下所示。public static Logger getLogger(Class? clazz) { Logger logger getLogger(clazz.getName()); ...... return logger; } public static Logger getLogger(String name) { // ILoggerFactory接口的实现类由Log4jLog4j2的桥接包以及Logback提供 ILoggerFactory iLoggerFactory getILoggerFactory(); return iLoggerFactory.getLogger(name); }在getLogger()方法中会调用到getILoggerFactory()方法来获取到ILoggerFactory接口的实现类Log4jLog4j2的桥接包以及Logback都提供了ILoggerFactory接口的实现类所以下面继续跟进getILoggerFactory()方法。public static ILoggerFactory getILoggerFactory() { if (INITIALIZATION_STATE UNINITIALIZED) { synchronized (LoggerFactory.class) { if (INITIALIZATION_STATE UNINITIALIZED) { INITIALIZATION_STATE ONGOING_INITIALIZATION; // 执行绑定逻辑初始化StaticLoggerBinder // Log4jLog4j2的桥接包以及Logback都会提供StaticLoggerBinder performInitialization(); } } } switch (INITIALIZATION_STATE) { case SUCCESSFUL_INITIALIZATION: // 通过StaticLoggerBinder得到ILoggerFactory的实现类 return StaticLoggerBinder.getSingleton().getLoggerFactory(); case NOP_FALLBACK_INITIALIZATION: return NOP_FALLBACK_FACTORY; case FAILED_INITIALIZATION: throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG); case ONGOING_INITIALIZATION: return SUBST_FACTORY; } throw new IllegalStateException(Unreachable code); }getILoggerFactory()方法中会先调用到performInitialization()方法来完成StaticLoggerBinder的初始化然后再调用StaticLoggerBinder的getLoggerFactory()方法得到ILoggerFactory下面跟进performInitialization()方法。private final static void bind() { try { SetURL staticLoggerBinderPathSet null; if (!isAndroid()) { // 获取所有StaticLoggerBinder的路径 staticLoggerBinderPathSet findPossibleStaticLoggerBinderPathSet(); // 如果存在多个StaticLoggerBinder的路径则全部打印出来 reportMultipleBindingAmbiguity(staticLoggerBinderPathSet); } // 这里执行日志框架的绑定 StaticLoggerBinder.getSingleton(); // 将初始化状态置为3表示成功完成StaticLoggerBinder的初始化也即成功完成日志框架的绑定 INITIALIZATION_STATE SUCCESSFUL_INITIALIZATION; // 打印实际绑定的是哪个日志框架 reportActualBinding(staticLoggerBinderPathSet); fixSubstituteLoggers(); replayEvents(); SUBST_FACTORY.clear(); } catch (NoClassDefFoundError ncde) { ...... } catch (java.lang.NoSuchMethodError nsme) { ...... } catch (Exception e) { ...... } }上述bind()方法会从classpath下的jar包中寻找StaticLoggerBinder然后将所有StaticLoggerBinder的路径存放在集合中如果存在多个StaticLoggerBinder的路径则将这些路径信息打印出来然后完成与StaticLoggerBinder的初始化一旦StaticLoggerBinder完成初始化则也完成了与实际的日志框架的绑定后续通过该日志框架提供的StaticLoggerBinder获取ILoggerFactory再通过获取到的ILoggerFactory获取到对应日志框架对Logger接口的实现类。整个调用时序图如下所示。总结由于单独使用Log4jLogback和log4j2日志框架时每个日志框架的使用各不相同所以为了减少切换日志框架时造成的代码入侵采用了Slf4j作为日志框架的统一门面所以可以认为Slf4j定义了日志框架的接口每种日志框架提供接口的实现。同时由于Log4j和Log4j2无法满足Slf4j定义的接口所以如果要将Log4j和Log4j2与Slf4j整合使用还需要引入Log4j和Log4j2的桥接包以达到既能完成与Slf4j整合还能不修改原有日志框架的代码的功能。

相关新闻

etipc开发指南:如何为Linux内核添加自定义TIPC功能

etipc开发指南:如何为Linux内核添加自定义TIPC功能

etipc开发指南:如何为Linux内核添加自定义TIPC功能 【免费下载链接】etipc enhanced tipc 项目地址: https://gitcode.com/openeuler/etipc 前往项目官网免费下载:https://ar.openeuler.org/ar/ etipc(enhanced tipc)是op…

2026/7/12 22:49:51阅读更多 →
深度解析:Cloudflare Tunnel Ingress Controller 架构设计与实战部署

深度解析:Cloudflare Tunnel Ingress Controller 架构设计与实战部署

深度解析:Cloudflare Tunnel Ingress Controller 架构设计与实战部署 【免费下载链接】cloudflare-tunnel-ingress-controller 🚀 Expose the website directly into the internet! The Kuberntes Ingress Controller based on Cloudflare Tunnel. 项目…

2026/7/12 22:44:51阅读更多 →
【Bug已解决】openclaw config schema mismatch / Unsupported config key — OpenClaw 配置模式不匹配解决方案

【Bug已解决】openclaw config schema mismatch / Unsupported config key — OpenClaw 配置模式不匹配解决方案

【Bug已解决】openclaw: "config schema mismatch" / Unsupported config key — OpenClaw 配置模式不匹配解决方案 1. 问题描述 OpenClaw 的配置文件与预期的模式不匹配,包含不支持的键: # 配置模式不匹配 $ openclaw "task" Error…

2026/7/12 22:44:51阅读更多 →
从零构建AI代理服务:LangGraph与FastAPI的完美结合指南

从零构建AI代理服务:LangGraph与FastAPI的完美结合指南

从零构建AI代理服务:LangGraph与FastAPI的完美结合指南 【免费下载链接】agent-service-toolkit Full toolkit for running an AI agent service built with LangGraph, FastAPI and Streamlit 项目地址: https://gitcode.com/GitHub_Trending/ag/agent-service-t…

2026/7/12 23:49:57阅读更多 →
LocalAI:如何构建自主可控的AI基础设施技术方案?

LocalAI:如何构建自主可控的AI基础设施技术方案?

LocalAI:如何构建自主可控的AI基础设施技术方案? 【免费下载链接】LocalAI LocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required. 项目地址: https://gitcode.com/GitHub_T…

2026/7/12 23:49:57阅读更多 →
Rufus终极指南:三步搞定Windows 11安装,轻松绕过TPM 2.0限制

Rufus终极指南:三步搞定Windows 11安装,轻松绕过TPM 2.0限制

Rufus终极指南:三步搞定Windows 11安装,轻松绕过TPM 2.0限制 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 你是否曾经因为电脑缺少TPM 2.0芯片而无法升级到Windows 11&a…

2026/7/12 23:49:57阅读更多 →
终极AI视频剪辑指南:用Autocut实现零基础智能剪辑

终极AI视频剪辑指南:用Autocut实现零基础智能剪辑

终极AI视频剪辑指南:用Autocut实现零基础智能剪辑 【免费下载链接】autocut 用文本编辑器剪视频 项目地址: https://gitcode.com/GitHub_Trending/au/autocut 还在为视频剪辑耗费大量时间而烦恼吗?Autocut是一款革命性的AI视频处理工具&#xff0…

2026/7/12 23:49:57阅读更多 →
人人微投票、评选星与天天评选三大平台深度横评

人人微投票、评选星与天天评选三大平台深度横评

在策划线上投票或评选活动时,很多开发者和技术负责人最头疼的往往不是功能实现,而是面对突发流量时的系统崩溃风险。想象一下,活动刚上线半小时,因为某个社群的转发,访问量瞬间激增,结果页面加载转圈、数据…

2026/7/12 23:49:57阅读更多 →
5个简单步骤:如何使用Teachable Machine构建你的第一个AI模型

5个简单步骤:如何使用Teachable Machine构建你的第一个AI模型

5个简单步骤:如何使用Teachable Machine构建你的第一个AI模型 【免费下载链接】teachablemachine-community Example code snippets and machine learning code for Teachable Machine 项目地址: https://gitcode.com/gh_mirrors/te/teachablemachine-community …

2026/7/12 23:44:57阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/12 0:02:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/12 0:02:11阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/12 0:02:11阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/12 0:02:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/12 0:02:11阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

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

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

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

2026/7/11 16:20:28阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

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

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

2026/7/11 23:15:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/12 21:43:43阅读更多 →