日志那些事儿——日志Logger漫谈
前言
最近在关注限流、降级、监控等系统稳定性方面的技术,反复牵涉到的几个技术名词是日志log,Aop切片。
-
限流降级怎么做?首先得对应用不要太侵入,那能想到的办法只能是使用Aop切片对需要限流降级的接口加一层校验。最近调研了公司相关的一些中间件,还蛮有收获,特别是关于如何稳定高效地获取qps、如何基于Spring进行Aop自定义扩展达到对于应用无侵入。
-
监控怎么做?在单应用的情况下能想到的办法就是记录日志,然后通过脚本实时分析日志的关键词,当超过阈值的时候通知到相关人,日志在这个过程中起到的作用非常关键。在分布式或者现在很火的微服务架构的情况下,日志会分散到各个应用中,调用链的分析变得很重要,这方面的框架有Google Dapper、Twitter ZipKin、Ali的鹰眼等,调用链的分析依赖的是日志中的traceId,很多公司都是用的这一套。再或者还有其他监控的方式,考虑不将监控的日志写入到文件中,而只是放在内存中,以JMX的方式提供出去也是可以考虑的,要做到对现有应用代码不侵入的话,可以考虑给Root Logger配置写入内存的Fake Appender。
-
最近还有一个需求,需要将一些业务信息进行埋点让BI分析,当然还是那个前提,对于应用代码的侵入越少越好,能想到的办法也只是Aop切片打日志然后采集然后分析,当然这其中有涉及到如何适配多重不同的日志系统(log4j or logback等)
前面说了这么多,也只是表明日志和Aop两大技术的重要性。当年开始学习Java的时候第一次接触日志还不知道干嘛用,现在知道干嘛用的但是却不知道其内部原理是啥?所以打算梳理一下java日志相关的技术点,Aop相关的技术点,了解了这两大技术点之后能做的事情就多了。
日志系统的发展
我们日常接触到的日志系统有很多种,log4j,JUL(jdk自带),logback等,我们可以直接根据对象的日志API进行使用。但是考虑到API各不相同,所以出现了JCL(Jakarta Commons Logging)、slf4j等日志API框架。日志API框架只是统一的API,其底层的具体的日志记录工作还是由log4j、JUL、logback等承担。这篇文章讲得非常清楚。
如何选择和搭配日志系统
目前来说,新应用使用logback是首选,一些老系统中很可能使用的是log4j等。目前slf4j对logback和log4j都支持,对JCL也提供了桥接方法,将JCL的api转化slf4j的API。贴一张Webx中的图足以说明一切(侵删)
日志系统.png组装日志系统
由于存在JCL,SLF4j两大日志框架,logback、log4j、JUL日志系统所以理论上有这么多种日志系统的搭配。
- JUL
- log4j
- logback
- jcl+log4j
- slf4j+slf4j-log4j12+log4j
- slf4j+logback
- jcl-over-slf4j+slf4j+logback
- jcl-over-slf4j+slf4j+slf4j-log4j12+log4j
其中slf4j+slf4j-log4j12+log4j、slf4j+logback是主流,推荐使用。
总结
粗略漫谈了日志系统的历史,组装等。最后留下一个问题吧!
- 我们通常会使用log4j.properties或者log4j.xml、logback.properties或者logback.xml来配置logger和appender,如何使用代码的方式进行配置?
- 我们如何能通过代码判断系统中使用的是log4j还是logback?