slf4j和log4j、logback
现在主流java项目一般使用slf4j+log4j的日志方案,最近抽点时间扫了一下slf4j、log4j、logback的官方文档,做个笔记。这篇比较不打算描述具体的配置方法,因为官方文档已经讲得很清楚了,而是描述一下核心的概念和方案。大家要对某个日志方案做一个全面了解的话,最好的方式是看官方文档,比baidu强很多。
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.html
slf4j
slf4j是一个日志门面框架,用来解决不同的库使用不同日志方案的问题。slf4j建立了到所有主流日志实现方案的桥接,假设我开发一个组件A,使用slf4j+(slf4j-brigdeto-log4)+log4j的方案来调试。当我发布A的时候,是不带这些日志库的,但是代码里面仍然会有打印日志的语句。当某个用户使用组件A时,他可以使用任意日志方案,只要采用slf4j+(slf4j-brigde-somelog)+somelog这个模式即可。在用户那边,组件A运行毫无障碍,日志功能也很正常,只不过底层的日志输出不再是log4j而是somelog。somelog可以log4j,logback或其它,只要是slf4j支持的日志方案就行。
因此使用这个方案,一般需要引入三个库,依次是:slf4j-api(slf4j接口库,应用代码里面直接使用);slf4j-bridgeto-somelog(slf4到somelog的桥接库);somelog(somelog实现库)。
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属性。
log4j必须要配置一个叫做root的logger,它是所有logger的根。
2) Appender
Appender代表日志的输出目的地,每个logger必须要至少绑定一个Appender才能真正输出日志。Appender有很多类型,最常见的就是Console和FileAppender了,分别代表控制台和本地文件。
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非常的类似。
slf4j和log4j、logback的更多相关文章
- Java日志框架:SLF4J,Common-Logging,Log4J,Logback说明
Log4j Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等 ...
- slf4j log4j logback关系详解和相关用法
slf4j log4j logback关系详解和相关用法 写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯.但是始终都是抱着"拿来主义"的态度,复制粘贴下配 ...
- slf4j,log4j,logback 初步使用
log4j,slf4j,logback简单介绍见 LogBack简易教程 Logback浅析 简单的将,slf4j是一个日志的框架,有各种日志的接口,但是并不包含实际的写日志的方法. log4j,lo ...
- log4j+logback+slf4j+commons-logging的关系与调试(转)
log4j+logback+slf4j+commons-logging的关系与调试 从Log4j迁移到LogBack的理由 http://www.tuicool.com/articles/beeeYv ...
- SpringBoot日志logback-spring.xml分环境log4j logback slf4j区别 springboot日志设置
转载. https://blog.csdn.net/qianyiyiding/article/details/76565810 springboot按照profile进行打印日志log4j logba ...
- slf4j log4j logback log4j2关系详解和相关用法
来源:slf4j log4j logback关系详解和相关用法https://www.cnblogs.com/Sinte-Beuve/p/5758971.html The Simple Logging ...
- Java日志框架SLF4J和log4j以及logback的联系和区别
1.SLF4J(Simple logging Facade for Java) 意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接 ...
- 拨云见日,彻底弄清楚Java日志框架 log4j, logback, slf4j的区别与联系
log4j 以及 logback, slf4j 官网 日志框架的困惑 作为一个正常的项目,是必须有日志框架的存在的,没有日志,很难追踪一些奇奇怪怪的系统问题. 但是,我们经常在项目的依赖中,见到奇奇怪 ...
- JCL、SLF4J、Log4J、Log4J2、LogBack和JUL之间的关系,你搞清楚了吗?
写在前面 日志组件是我们平时开发过程中必然会用到的组件.在系统中正确的打印日志至少有下面的这些好处: 调试:在程序的开发过程中,必然需要我们不断的调试以达到程序能正确执行的状态 .记录日志可以让开发人 ...
随机推荐
- 170328、Maven+SpringMVC+Dubbo 简单的入门demo配置
之前一直听说dubbo,是一个很厉害的分布式服务框架,而且巴巴将其开源,这对于咱们广大程序猿来说,真是一个好消息.最近有时间了,打算做一个demo把dubbo在本地跑起来先. 先copy一段dubbo ...
- ORACLE安装(12c-Redhat6.5)
Oracle安装(12c-Redhat6.5) Redhat6.5系统准备 / 10G SWAP 4G /boot 200M /HOME 4G /usr 8G /var 4G /u01 Preinst ...
- 为ElasticSearch添加HTTP基本认证 https://github.com/Asquera/elasticsearch-http-basic/releases
ES的HTTP连接没有提供任何的权限控制措施,一旦部署在公共网络就容易有数据泄露的风险,尤其是加上类似elasticsearch-head这样友好的前端界面,简直让你的数据瞬间裸奔在黑客的眼皮底下.项 ...
- react es6语法 之 => 箭头函数
参考:https://www.cnblogs.com/secretAngel/p/9699356.html (1).只有一个参数且只有一句表达式语句的,函数表达式的花括号可以不写let test = ...
- JS生成随机字符串的多种方法
这篇文章主要介绍了JS生成随机字符串的方法,需要的朋友可以参考下 下面的一段代码,整理电脑时,记录备查. <script language="javascript"> ...
- 【开发者笔记】按List中存放对象的某一字段计数的问题
如题,假设有如下表t_info: name date info a 20127-12-20 xxxx描述 b 20127-12-20 yyyyy描述 c 20127-12-21 zzz描述 d 201 ...
- jenkins用户管理(Role-based Authorization Strategy插件使用)
安装:Role-based Authorization Strategy插件 一.点击左侧的"系统管理"-->再点击绿色的"管理插件" 二.点击&quo ...
- Hadoop2.7.3+spark2.1.0+hbase0.98分布式集群部署
运行环境配置(10.79.115.111-114) 1.关闭防火墙与selinux 关闭防火墙: CentOS 7.x默认使用的是firewall作为防火墙. systemctl stop firew ...
- su 与 su - 区别
su与su -都是用来切换用户的命令,简单说它们之间的区别就是:su -切换的干净彻底,而su 切换用户却拖泥带水. su su username,切换到指定用户,但是当前目录不会变化,环境变量还是上 ...
- Linux系统下RPM命令和yum的使用
Linux系统下RPM命令和yum的使用 RPM:Redhat Packages Manager (红帽系列软件包的管理),主要用于安装.卸载.升级和管理软件. 一个包由下面几个部分构成: 例如:ht ...