现在找个网站这么难的吗,泰安外贸网站建设公司,光谷网站建设公司,群晖wordpress连接外网教程目录 一、概述1.1. 核心日志框架1.2 门面日志框架 二、最佳实践2.1 核心日志框架API包2.2 门面日志框架依赖2.3 集成使用2.3.1 集成jcl2.3.2 集成slf4j2.3.2.1 slf4j集成单一框架2.3.2.2 slf4j整合混合框架 三、总结3.1 所有相关包3.1.1 核心日志框架包3.1.2 门面日志框架3.1.3… 目录 一、概述1.1. 核心日志框架1.2 门面日志框架 二、最佳实践2.1 核心日志框架API包2.2 门面日志框架依赖2.3 集成使用2.3.1 集成jcl2.3.2 集成slf4j2.3.2.1 slf4j集成单一框架2.3.2.2 slf4j整合混合框架 三、总结3.1 所有相关包3.1.1 核心日志框架包3.1.2 门面日志框架3.1.3 适配包 3.2 依赖冲突解决总结 一、概述
本文乃博主呕心沥血之作一文搞清楚java所有日志框架。阅读前请先收藏。
1.1. 核心日志框架
核心日志框架就是实际干活的日志框架。总体而言市面上的使用日志框架体系主要有 jul(java.util.logging) jdk1.4加入为了对抗log4j效率灵活性较差使用较少log4j 最广泛应用的日志框架成为事实上的标准logback 基于slf4j-api接口实现性能高于log4jlog4j2 重写了log4j性能高于log4j,logback 1.2 门面日志框架
核心日志框架能单独使用但多框架集成使用时使用会有冲突。所以出现了门面日志框架。
门面日志框架特征有 提供统一日志使用接口核心日志框架去实现门面日志框架的接口。应用不使用具体的核心日志框架只使用门面日志框架。不依赖核心日志框架只依赖门面日志框架。这样就算底层换核心框架依赖不影响现有日志的使用。 目前主流的门面框架主要有JCL和SLF4J JCL(commings-log) Apache提供的comming-logSLF4J(simple log facade for java) Log4j、Logback、Log4j2作者提供 二、最佳实践
2.1 核心日志框架API包
各核心日志框架单独使用的依赖demo里的version不限制。
log4j
!-- log4j的API包 --
dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version
/dependencylog4j2
!-- log4j2的两个API包 --
dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-api/artifactIdversion2.9.1/version
/dependency
dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.9.1/version
/dependencylogback !-- logback的两个API包--!-- logback无法单独使用只能和slf4j集合使用--!-- logback-classic实现了slf4j向logback的转换--dependencygroupIdch.qos.logback/groupIdartifactIdlogback-core/artifactIdversion1.2.3/version/dependencydependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.3/version/dependencyjul
jdk自带API无依赖包 2.2 门面日志框架依赖
jcl !-- jcl的API包 --dependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.1.1/version/dependencyslf4j !-- slf4j的API --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.25/version/dependency2.3 集成使用
2.3.1 集成jcl 总结如下 JCL集成其他日志框架,只有log4j/jul没有中间包JCL同时集成其他核心日志框架,使用JCL打印日志优先级: log4j2log4jjulJCL同时和jul/log4j/log4j2集成,jcl没有全局整合能力各日志全部生效JCL同时和jul/log4j/log4j2集成,此时使用JCL打印日志生效的是log4j2slf4j转向JCL前提是没有slf4j的实现框架依赖,否则slf4j实现优先级更高 集成jul
默认jcl就是集成jul的 !-- jcl的API包 --dependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.1.3/version/dependency集成log4j !-- jcl的API包 --dependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.1.3/version/dependency!-- log4j的API --dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency集成log4j2 !-- jcl的API包 --dependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.2/version/dependency!-- log4j2的两个API包 --dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-api/artifactIdversion2.9.1/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.9.1/version/dependency!-- 适配包:jcl转向log4j2 --dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-jcl/artifactIdversion2.9.1/version/dependency集成slf4j !-- slf4j的API包 --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.25/version/dependency!-- 适配包:slf4j转向jcl --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-jcl/artifactIdversion1.7.25/version/dependency!-- JCL的实现包,可以为jul/log4j/logj42这里省略。默认是jul --2.3.2 集成slf4j
2.3.2.1 slf4j集成单一框架 总结如下: SLF4J转向其他日志框架都需要对应适配包其他日志框架经过JCL转向SLF4J时,一般可以省略JCL通过匹配包直接转向SLF4J不再展开SLF4J和具体日志框架的双向适配包不能同时存在(需排除冲突),否则会循环依赖栈溢出.包括: slf4j-jdk14和jul-to-slf4j(运行时直接栈溢出) slf4j-log4j12和log4j-over-slf4j(启动会检测报错) log4j-slf4j-impl和log4j-to-slf4j(运行时直接栈溢出) slf4j-jcl和jcl-over-slf4j(启动会检测报错) 集成jul !-- slf4j的API --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.25/version/dependency!-- 适配包:slf4j转向jul --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-jdk14/artifactIdversion1.7.25/version/dependency!-- 适配包:jul转向slf4j --!-- 若和slf4j-jdk14包同时存在会造成jul和slf4j循环转化造成栈溢出,所以要排除 --
!-- dependency--
!-- groupIdorg.slf4j/groupId--
!-- artifactIdjul-to-slf4j/artifactId--
!-- version1.7.25/version--
!-- /dependency--集成log4j !-- log4j的API包 --dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency!-- slf4j的API --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.25/version/dependency!-- log4j对slf4j的实现:log4j转slf4j --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactIdversion1.7.25/version/dependency!-- 适配包:log4j转向slf4j --!-- log4j-over-slf4j和slf4j-log4j12同时存在会循环依赖栈溢出,需要排除--
!-- dependency--
!-- groupIdorg.slf4j/groupId--
!-- artifactIdlog4j-over-slf4j/artifactId--
!-- version1.7.25/version--
!-- /dependency--集成log4j2 !-- log4j2的两个API包 --dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-api/artifactIdversion2.9.1/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.9.1/version/dependency!-- slf4j的API --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.25/version/dependency!-- 适配包: slf4j转向log4j2 --dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-slf4j-impl/artifactIdversion2.9.1/version/dependency!-- 适配包: log4j2转向slf4j --!-- log4j-to-slf4j和log4j-slf4j-impl同时存在会循环依赖栈溢出,需要排除--
!-- dependency--
!-- groupIdorg.apache.logging.log4j/groupId--
!-- artifactIdlog4j-to-slf4j/artifactId--
!-- version2.9.1/version--
!-- /dependency--集成logback !-- slf4j的API包 --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.25/version/dependency!-- logback的两个API包--!-- logback的Log相关API和包路径和slf4j一样,所以logback可以看作是slf4j的默认实现包--dependencygroupIdch.qos.logback/groupIdartifactIdlogback-core/artifactIdversion1.2.3/version/dependencydependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.3/version/dependency集成JCL !-- jul默认是JCL默认的实现包也可以指定为log4j/log4j2 --!-- jcl的API包 --dependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.1.1/version/dependency!-- slf4j的API包 --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.25/version/dependency!-- 适配包: slf4j转向jcl --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-jcl/artifactIdversion1.7.25/version/dependency!-- jcl-over-slf4j和slf4j-jcl同时存在会循环依赖栈溢出,需要排除--!-- 适配包: jcl转向slf4j --
!-- dependency--
!-- groupIdorg.slf4j/groupId--
!-- artifactIdjcl-over-slf4j/artifactId--
!-- version1.7.25/version--
!-- /dependency--2.3.2.2 slf4j整合混合框架
slf4j获取具体框架的流程如下可得知slf4j最终只能转向单个日志框架。 LoggerFactory.getLogger触发初始化 - 根据classLoader查找org/slf4j/impl/StaticLoggerBinder.classcheck不能有多个 - 触发org.slf4j.impl.StaticLoggerBinder(不同集成框架路径相同实现不同)的getBean初始化 - 报告StaticLoggerBinder的实际采用 - slf4j版本检验 - 根据StaticLoggerBinder获取org.slf4j.ILoggerFactory - 根据ILoggerFactory获取到org.slf4j.Logger 两个或以上的日志框架使用时需要整合。达到以下目标 全部日志API生效能正常输出日志排除冲突避免循环转换栈溢出排除冲突避免slf4j转向实现框架 根据最终转向的日志框架分类 最终整合为jul 最终整合为log4j 最终整合为log4j2 最终整合为logback 三、总结
3.1 所有相关包
3.1.1 核心日志框架包 !-- log4j的API包 --dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency!-- log4j2的两个API包 --dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-api/artifactIdversion2.9.1/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.9.1/version/dependency!-- logback的两个API包--!-- logback的Log相关API和包路径和slf4j一样,所以logback可以看作是slf4j的默认实现包--dependencygroupIdch.qos.logback/groupIdartifactIdlogback-core/artifactIdversion1.2.3/version/dependencydependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.3/version/dependency3.1.2 门面日志框架 !-- slf4j的API --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.25/version/dependency!-- jcl的API包 --dependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.1.1/version/dependency3.1.3 适配包 !-- 适配包:slf4j转向jul --!-- jul-to-slf4j和slf4j-jdk14包同时存在会造成jul和slf4j循环转化,所以要排除 --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-jdk14/artifactIdversion1.7.25/version/dependency!-- 适配包:jul转向slf4j --!-- jul-to-slf4j和slf4j-jdk14包同时存在会造成jul和slf4j循环转化,所以要排除 --dependencygroupIdorg.slf4j/groupIdartifactIdjul-to-slf4j/artifactIdversion1.7.25/version/dependency!-- 适配包:slf4j转向log4j --!-- log4j-over-slf4j和slf4j-log4j12同时存在会循环依赖栈溢出,需要排除--dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactIdversion1.7.25/version/dependency!-- 适配包:log4j转向slf4j --!-- log4j-over-slf4j和slf4j-log4j12同时存在会循环依赖栈溢出,需要排除--dependencygroupIdorg.slf4j/groupIdartifactIdlog4j-over-slf4j/artifactIdversion1.7.25/version/dependency!-- 适配包: slf4j转向log4j2 --!-- log4j-to-slf4j和log4j-slf4j-impl同时存在会循环依赖栈溢出,需要排除--dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-slf4j-impl/artifactIdversion2.9.1/version/dependency!-- 适配包: log4j2转向slf4j --!-- log4j-to-slf4j和log4j-slf4j-impl同时存在会循环依赖栈溢出,需要排除--dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-to-slf4j/artifactIdversion2.9.1/version/dependency!-- 适配包: slf4j转向jcl --!-- jcl-over-slf4j和slf4j-jcl同时存在会循环依赖栈溢出,需要排除--dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-jcl/artifactIdversion1.7.25/version/dependency!-- jcl-over-slf4j和slf4j-jcl同时存在会循环依赖栈溢出,需要排除--!-- 适配包: jcl转向slf4j --dependencygroupIdorg.slf4j/groupIdartifactIdjcl-over-slf4j/artifactIdversion1.7.25/version/dependency!-- 适配包:jcl转向log4j2 --dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-jcl/artifactIdversion2.9.1/version/dependency3.2 依赖冲突解决总结
双向适配包循环依赖 slf4j-jdk14和jul-to-slf4j(运行时直接栈溢出) slf4j-log4j12和log4j-over-slf4j(启动会检测报错) log4j-slf4j-impl和log4j-to-slf4j(运行时直接栈溢出) slf4j-jcl和jcl-over-slf4j(启动会检测报错) slf4j单个实现类
使用slf4j整合其他框架时只能转向单个日志框架即class路径只能有一个org.slf4j.impl.StaticLoggerBinder
因此以下包不能同时使用只能出现一个 slf4j-jdk14 slf4j-log4j12 log4j-slf4j-impl logback-classic slf4j-jcl 其他冲突
比如
log4j.jar 低版本的和高版本冲突目前测试下来log4j1.2.6和1.2.17 两个jar同时引入导致日志不能打印