JAVA常用的日志打印组件
1、概述
眼下java应用日志收集都是採用日志框架(slf4j、apache commons logging)+日志系统(log4j、log4j2、LogBack、JUL等)的方式。而针对在分布式环境须要实时分析统计的日志,一般採用apache flume、facebook scribe等分布式日志收集系统。
日志框架:提供日志调用的接口,实际的日志输出托付给日志系统实现。
-
JCL(Jakarta Commons Logging):比較流行的日志框架,非常多框架都依赖JCL,比如Spring等。
-
SLF4j:提供新的API,初衷是配合Logback使用,但同一时候兼容Log4j。
Apache Commons Loging (JCL)
Commons Loging 本身只提供日志接口,具体实现在运行时动态寻找对应组件?比如:log4j、jdk14looger 等。但这种动态绑定的方式当系统特别宠大的时候会出现绑定失败的问题。现在比较流行的slf4j 基于静态绑定的方式解决了这个问题?
slf4j
sl4j 本身也只提供日志接口,与commons loging 不同的是其采用在classPath 加入以下jar包来表示具体采用哪种实现 :
-
slfj-log4j12.jar (表示指定 log4j)
-
slf4j-jdk14.jar(表示指定jdk Looging)
-
slf4j-jcl.jar(表示指定jcl)
-
log4j-slf4j-impl(表示指定log4j2)
-
logback-classic(表示指定logback)
日志系统:负责输出日志
-
Log4j:经典的一种日志解决方式。内部把日志系统抽象封装成Logger 、appender 、pattern 等实现。我们能够通过配置文件轻松的实现日志系统的管理和多样化配置。
-
Log4j2:Log4j的2.0版本号。对Log4j进行了优化。比方支持參数API、支持异步appender、插件式架构等
-
Logback:Log4j的替代产品。须要配合日志框架SLF4j使用
-
JUL(java.util.logging):JDK提供的日志系统。较混乱,不经常使用
| 日志框架 | 介绍 |
|---|---|
| jul(java.util.logging) | jdk1.4加入,为了对抗log4j,效率灵活性较差使用较少 |
| log4j | 最广泛应用的日志框架,成为事实上的标准 |
| logback | 基于slf4j-api接口实现,性能高于log4j |
| log4j2 | 重写了log4j,性能高于log4j,logback |
眼下我们的应用大部分都是使用了SLF4j作为门面,然后搭配log4j或者log4j2日志系统。
其他日志框架统一转换为slf4j
日志体系各种包总结
| 日志框架 | 包 |
|---|---|
| log4j | 只有log4j |
| log4j2 | log4j-api(日志接口),log4j-core(log4j-api的实现) |
| logback | logback-core(logback核心包),logback-classic(slf4j-api的实现) |
| commons-logging | commons-logging (jcl),log4j-jcl(commons-logging到log4j的桥梁),jcl-over-slf4j(commons-logging到slf4j的桥梁) |
| - 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:
-
jul-to-slf4j:jdk-logging到slf4j的桥梁
-
log4j-over-slf4j:log4j1到slf4j的桥梁
-
jcl-over-slf4j:commons-logging到slf4j的桥梁
jcl与日志框架的集成
slf4j与日志框架的继承
log4j2.xml配置示例
<?xml version="1.0" encoding="UTF-8" ?><Configuration status="error">
<!-- 定义输出源 -->
<Appenders>
<Console name="Console" target="SYSTEM_ERR">
<PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
</Console>
<!-- 测试环境使用-->
<File name="file" fileName="logs/all.log" append="false">
<PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
</File>
<RollingFile name="rollingFile" fileName="logs/all-2.log"
filePattern="logs/?{date:yyyy-MM-dd}/all-%d{yyyy-MM-dd-HH}-%i.zip">
<PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="2 KB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
<RollingFile name="errorRollingFile" fileName="logs/error2.log"
filePattern="logs/?{date:yyyy-MM-dd}-error/error-%d{yyyy-MM-dd-HH}-%i.zip">
<PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
<ThresholdFilter level="error" />
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="2 KB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<!-- 具体的日志配置 name =-->
<Loggers>
<!-- <Logger name="org.springframework" level="error">
<AppenderRef ref="Console"/>
</Logger>-->
<Logger name="com.tuliing" level="info">
<AppenderRef ref="rollingFile"/>
<AppenderRef ref="errorRollingFile"/>
</Logger>
<AsyncRoot level="debug">
<AppenderRef ref="Console"/>
<!-- <AppenderRef ref="file"/>
<AppenderRef ref="rollingFile"/>-->
</AsyncRoot>
</Loggers></Configuration>
推荐阅读
本公众号会不定期给大家发福利,包括学习资源等,敬请期待吧!
推送内容如果现在工作用不上,可以先转发朋友圈或收藏,用的时候方便找。
另外欢迎公众号回复 微信 ,添加微信好友,互相学习交流。