导图社区 Java Log
必看!内容主要可包含了实现日志框架、统一化框架和各种jar包详解三大板块,详细内容包含有logging术语以及使用方法等内容,难点不再难!快快收藏起来吧!
编辑于2019-07-16 01:05:45程序猿知识技能总结大全,java、python、正则表达式、Linux等多方面知识导图
包含抖音运营、短视频运营要点、运营之光、从零开始做运营、学会写作等多个运营读书笔记、运营知识框架等
产品、运营工具包大全:办公工具、文字工具、音频工具、视频工具、社群工具、公众号辅助工具、排版工具、图片工具、H5工具、小程序工具等
项目管理流程竖版思维导图、从需求收集、需求评审、规划阶段、再到方案实现阶段、测试阶段、至最后的上线阶段,详细描述每个阶段的工作内容
产品需求文档(PRD)是确保团队理解项目需求和目标的关键文档。在撰写PRD时,要明确项目背景、需求类型,遵循有理有据、全面清晰、易读的写作原则。选择适当的工具如Axure或Word,包括文档修改记录、项目背景、名词解释、流程图、需求说明等内容。使用原型工具结合需求,提供清晰的视觉参考。详细描述每个功能点,包括权限、规则逻辑、极值、交互等。使用标点符号、示例、标记重要内容,提高文档可读性。最终,根据项目需求决定是否包含额外的内容,以确保PRD有效指导项目开发。
系统集成项目管理工程师-十大管理输入、输出、工具总结,软考必备复习导图
社区模板帮助中心,点此进入>>
程序猿知识技能总结大全,java、python、正则表达式、Linux等多方面知识导图
包含抖音运营、短视频运营要点、运营之光、从零开始做运营、学会写作等多个运营读书笔记、运营知识框架等
产品、运营工具包大全:办公工具、文字工具、音频工具、视频工具、社群工具、公众号辅助工具、排版工具、图片工具、H5工具、小程序工具等
项目管理流程竖版思维导图、从需求收集、需求评审、规划阶段、再到方案实现阶段、测试阶段、至最后的上线阶段,详细描述每个阶段的工作内容
产品需求文档(PRD)是确保团队理解项目需求和目标的关键文档。在撰写PRD时,要明确项目背景、需求类型,遵循有理有据、全面清晰、易读的写作原则。选择适当的工具如Axure或Word,包括文档修改记录、项目背景、名词解释、流程图、需求说明等内容。使用原型工具结合需求,提供清晰的视觉参考。详细描述每个功能点,包括权限、规则逻辑、极值、交互等。使用标点符号、示例、标记重要内容,提高文档可读性。最终,根据项目需求决定是否包含额外的内容,以确保PRD有效指导项目开发。
系统集成项目管理工程师-十大管理输入、输出、工具总结,软考必备复习导图
JavaEE 企业级分布式高级架构
实现日志框架
logging
术语
Logger
LoggerManager,Handler的代言人
层次关系,名称为空的root logger
LogManager
所有logger的生成、获取等
配置文件的读取
Hashtable缓存所有logger
Handler
控制日志输出
JDK自带的ConsoleHanlder把输出流重定向到System.err输出
每次Logger输出调用Handler的publish方法
每个Logger多个handler
Formatter
输出前格式化
Log Level
日志输出粒度的不同需求
Handler,Logger都有日志级别
使用
创建LogManager
默认是java.util.logging.LogManager
修改系统属性"java.util.logging.manager"
加载配置文件
默认是jre目录下的lib/logging.properties文件
修改系统属性"java.util.logging.config.file”
创建Logger
并缓存起来,放置到一个Hashtable中,并把LogManager设置进新创建的logger中
log4j1
LogManager
它的类加载会创建logger仓库Hierarchy
尝试寻找类路径下的配置文件,如果有则解析
Hierarchy
LoggerFactory logger的创建工厂
Hashtable 用于存放上述工厂创建的logge
Logger root logger,用于承载解析文件的结果,设置级别,同时存放appender
PropertyConfigurator
用于解析log4j.properties文件
Logger
用来输出日志的对象
log4j2
背景
log4j2与log4j1发生了很大的变化,不兼容
log4j1仅仅作为一个实际的日志框架
slf4j、commons-logging作为门面,统一各种日志框架的混乱格局
log4j2也想跳出来充当门面了
模块
log4j-api
作为日志接口层,用于统一底层日志系统
log4j-core
作为上述日志接口的实现,是一个实际的日志框架
使用过程
获取底层使用LoggerContextFactory
LogManager的类加载会去寻找log4j-api定义的LoggerContextFactory接口的底层实现
第一种: 尝试从jar中寻找log4j2.component.properties文件,如果配置了log4j2.loggerContextFactory则使用该LoggerContextFactory
第二种:如果没找到,尝试从jar包中寻找META-INF/log4j-provider.properties文件,如log4j-core-2.2中就有该文件
第三种:上述方式还没找到,就使用默认的SimpleLoggerContextFactory
使用LoggerContextFactory获取LoggerContext
根据LoggerContext获取Logger
对象
LogManager
它的类加载会去寻找LoggerContextFactory接口的底层实现,会从jar包中的配置文件中寻找
LoggerContextFactory
用于创建LoggerContext,不同的日志实现系统会有不同的实现,如log4j-core中的实现为Log4jContextFactory
PropertyConfigurator
用于解析log4j.properties文件
LoggerContext
它包含了配置信息,并能创建log4j-api定义的Logger接口实例,并缓存这些实例
ConfigurationFactory
上述LoggerContext解析配置文件,需要用到ConfigurationFactory,目前有三个YamlConfigurationFactory、JsonConfigurationFactory、XmlConfigurationFactory,分别解析yuml json xml形式的配置文件
logback
说明
和slf4j集成,不入侵代码
没有配置文件的情况下,使用的是默认配置
不同的日志系统与slf4j集成,都会有一个StaticLoggerBinder类,并会拥有一个ILoggerFactory的实现
配置搜索
logback.groovy
logback-test.xml
logback.xml
com.qos.logback.classic.spi.Configurator
BasicConfigurator
使用过程
slf4j与底层的日志系统进行绑定,在jar包中寻找org/slf4j/impl/StaticLoggerBinder.class这个类
如在logback-classic中就含有这个类
如果找到多个StaticLoggerBinder,则表明目前底层有多个实际的日志框架,slf4j会随机选择一个。
上述找到的StaticLoggerBinder创建一个实例,并返回一个ILoggerFactory实例
logback-classic中的StaticLoggerBinder为例,在StaticLoggerBinder.getSingleton()过程中:会去加载解析配置文件
返回的ILoggerFactory实例,来获取Logger,就是根据上述的LoggerContext来创建一个Logger
每个logger与LoggerContext建立了关系,并放到LoggerContext的缓存中
各种jar包
log4j1
全部log4j:log4j1
log4j2
log4j-api:log4j2定义的API
log4j-core:log4j2上述API的实现
logback
logback-core:logback的核心包
logback-classic:logback实现了slf4j的API
commons-logging
commons-logging:commons-logging的原生全部内容
log4j-jcl:commons-logging到log4j2的桥梁
jcl-over-slf4j:commons-logging到slf4j的桥梁
slf4j转向某个实际框架
slf4j-jdk14:slf4j到jdk-logging的桥梁
slf4j-log4j12:slf4j到log4j1的桥梁
log4j-slf4j-impl:slf4j到log4j2的桥梁
logback-classic:slf4j到logback的桥梁
slf4j-jcl:slf4j到commons-logging的桥梁
某个实际的日志框架转向slf4j
使用场景:log4j1的API编程,logback输出
jul-to-slf4j:jdk-logging到slf4j的桥梁
log4j-over-slf4j:log4j1到slf4j的桥梁
jcl-over-slf4j:commons-logging到slf4j的桥梁
统一化框架
commons-logging
说明
Log、LogFactory都是commons-logging自己的接口和类
简称jcl
和slf4j一样是个统一的API,不是实际的实现
使用原理
获取LogFactory
系统属性org.apache.commons.logging.LogFactory中获取
使用java的SPI机制,搜寻路径META-INF/services/org.apache.commons.logging.LogFactory
commons-logging.properties,目前大多数情况下,我们都没有去使用它
还没找到的话,使用默认的org.apache.commons.logging.impl.LogFactoryImpl
LogFactory获取Log
commons-logging默认提供的LogFactory实现:LogFactoryImpl
commons-logging默认提供的Log实现:Jdk14Logger、Log4JLogger、SimpleLog
commons-logging.properties配置文件中寻找属性为"org.apache.commons.logging.Log"
从系统属性org.apache.commons.logging.Log中寻找Log实现类的类名
从classesToDiscover属性
与jul集成(java.util.logging)
commons-logging.commons-logging.*.jar
与log4j1集成
commons-logging.commons-logging.*.jar
log4j.log4j.*.jar
与log4j2集成
commons-logging.commons-logging.*.jar
log4j2的API包org.apache.logging.log4j.log4j-api.*.jar
log4j2的API实现包org.apache.logging.log4j.log4j-core*.jar
log4j2与commons-logging的集成包org.apache.logging.log4j.log4j-jcl.*.jar
与logback集成
org.slf4j.jcl-over-slf4j.*.jar(替代了commons-logging)
logback本身的使用其实就和slf4j绑定了起来
先将commons-logging底层的log实现转向slf4j(jcl-over-slf4j干的事)
再根据slf4j的选择底层日志原理,我们使之选择上logback
org.slf4j.slf4j-api.*.jar
ch.qos.logback.logback-core.*.jar
ch.qos.logback.logback-classic.*.jar
slf4j
说明
Simple Logging Facade for Java,为java提供的简单日志Facade
他不负责具体的日志实现,只在编译时负责寻找合适的日志系统进行绑定
除了public final class LoggerFactory类之外,都是接口定义
使用原理
获取ILoggerFactory
从类路径中寻找org/slf4j/impl/StaticLoggerBinder.class类
“随机选取"一个StaticLoggerBinder.class来创建一个单例
创建的StaticLoggerBinder单例,返回一个ILoggerFactory实例
ILoggerFactory获取Logger
与jdk-logging集成
org.slf4j.slf4j-api.*.jar
org.slf4j.slf4j-jdk14.*.jar
与log4j1集成
org.slf4j.slf4j-api.*.jar
org.slf4j.slf4j-log4j12.*.jar
log4j.log4j.*.jar
与log4j2集成
org.slf4j.slf4j-api.*.jar
org.apache.logging.log4j.log4j-api.*.jar
org.apache.logging.log4j.log4j-core.*.jar
org.apache.logging.log4j.log4j-slf4j-impl.*.jar
与logback集成
org.slf4j.slf4j-api.*.jar
ch.qos.logback.logback-core.*.jar
ch.qos.logback.logback-classic.*.jar