log框架整理
2017-04-06 18:02:42 0 举报
AI智能生成
java日志框架
作者其他创作
大纲/内容
统一化框架
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
实现日志框架
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的桥梁
0 条评论
下一页