slf4j和log4j、logback

如今主流java项目通常使用slf4j+log4j的日志方案,最近抽点时间扫了一下slf4j、log4j、logback的官方文档,作个笔记。这篇比较不打算描述具体的配置方法,由于官方文档已经讲得很清楚了,而是描述一下核心的概念和方案。你们要对某个日志方案作一个全面了解的话,最好的方式是看官方文档,比baidu强不少。html

log4j官方文档[https://logging.apache.org/log4j/2.x/index.html)(https://logging.apache.org/log4j/2.x/index.html)。
logback官方文档https://logback.qos.ch/manual/index.htmljava

slf4j

slf4j是一个日志门面框架,用来解决不一样的库使用不一样日志方案的问题。slf4j创建了到全部主流日志实现方案的桥接,假设我开发一个组件A,使用slf4j+(slf4j-brigdeto-log4)+log4j的方案来调试。当我发布A的时候,是不带这些日志库的,可是代码里面仍然会有打印日志的语句。当某个用户使用组件A时,他可使用任意日志方案,只要采用slf4j+(slf4j-brigde-somelog)+somelog这个模式便可。在用户那边,组件A运行毫无障碍,日志功能也很正常,只不过底层的日志输出再也不是log4j而是somelog。somelog能够log4j,logback或其它,只要是slf4j支持的日志方案就行。apache

所以使用这个方案,通常须要引入三个库,依次是:slf4j-api(slf4j接口库,应用代码里面直接使用);slf4j-bridgeto-somelog(slf4到somelog的桥接库);somelog(somelog实现库)。api

log4j2

目前使用最多的日志方案,从使用的角度,log4j2有3个核心概念:Logger,Appender,Layout。架构

1)logger

logger表明一个日志输出对象,它是一个命名对象,而且多个logger经过名字能够造成一个父子层级体系。
假若有一个logger A名字叫作"com",B的名字叫作"com.java",C名字叫作"com.java.controller",那么C是B的后代,B是A的后代。
这样当C经过logger.info输出一条日志时,这条日志会在这个层级中往上传递;固然某个层级的logger可能会某种方式中断这个传递,好比addtivity属性。app

log4j必需要配置一个叫作root的logger,它是全部logger的根。框架

2) Appender

Appender表明日志的输出目的地,每一个logger必需要至少绑定一个Appender才能真正输出日志。Appender有不少类型,最多见的就是Console和FileAppender了,分别表明控制台和本地文件。debug

3) Layout

表明日志的格式化器,是Appender的子元素。在Appender决定要输出一条日志时,才会使用格式化器格式化日志为一条文本。
这意味着,日志的格式化被尽可能延迟,因此咱们输出日志要使用logger.info("event {} happend at {}",event,location)这样的占位符形式,而不是logger.info("event "+event+" happend at "+location)。前者在日志被过滤的状况下根本不会执行格式化。设计

4 )Level

level是logger的属性,对日志作一个有序的分类,从低到高依次是TRACE,DEBUG,INFO,WARN,ERROR,FATAL,若是level设置成ERROR,那么只能输出ERROR和FATAL,更低层次的日志会被丢弃。调试

5 )Filter

fiter是过滤器,能够对日志执行一些过滤操做,他能够用在logger上,也能够用在appender上,还能够用在全局。

最后,若是配置看起来没问题,可是运行却不如预期,怎么办?能够经过System.setProperty("log4j2.debug","true")让log4j打印内部日志(还有其余手段,这里抛砖引玉)。了解上面的这些知识点,再查查资料,复制粘贴一下,大多数状况下,就能搞定日志系统了。

logback

logback是log4j同一个做者设计的,是用来取代后者的日志方案。之因此要额外再设计一个logback,是由于slf4j和log4j经过桥接模式来工做,效率多少受点影响;logback则是直接基于sfl4j规范设置的,彻底不须要桥接。所以logback的架构、配置与log4j很是的相似。

相关文章
相关标签/搜索