当前位置:首页 > 后端开发 > 日志那些事儿

日志那些事儿

6个月前 (05-21)39

谈谈日志那些事

对于日志框架的困惑:

还在为弄不清commons-logging.jar、log4j.jar、sl4j-api.jar等日志框架之间复杂的关系而感到烦恼吗?

还在为如何统一系统的日志输出而感到不知所措嘛?

您是否依然存在这样的烦恼?

比如,要更改spring的日志输出为log4j 2,却不知该引哪些jar包,只知道去百度一下所谓的博客,照着人家复制,却无法弄懂其中的原理?

日志框架的发展:
1原始阶段

从前有个姑娘叫小红,70后程序猿,

用的 jdk1.3,跟踪日志用,System.out.println("")追踪  ;

捕获异常的情况, try  catch{  System.out.println("") }    

输出一些关键变量System.out.println("")上线,部署了大量的System.out.println("")  。

缺点:

能不能记录在文本里面啊,去服务器取日志就行了,只能从控制台看日志。

2开始优化  

小红写了一个logUtil的工具类, 用loginfo的方法 替换 system.out.print .  这时候就有文本了, 就可以顺利追踪到了。但是有些异常不会立马反馈 ,有可能几个小时后我们才会发现异常,而且随着项目运营越来越多,用户请求量越来越大,一个小时都有可能有很多日志,一天好几个G的日志

这时候一个文本文件根本解决不了问题,小红现在就要解决这个问题

1)日志的迭代:

那就按天去迭代日志,按照日期或者小时,比如这样:2020-10-01-20M.log

然后就是按照日志的大小也可以迭代,这样就解决了日志的跟踪问题

2)日志异常信息发送消息

还可以在日志出现异常的情况,马上通知我有异常了,马上去改bug,loginfo发送异常信息

3)日志分级

现在的问题是日志太大了

但是有些信息不需要啊,异常的一些关键信息也需要,但是有些不需要,采用分级的方法

1追踪  2 信息   3调试    4异常 

设置日志的等级,设置3的话,只记录3和4的等级

这样的话日志文件就变小了

4)异步记录日志

异步的io操作,异步记录记录日志

5)自由控制日志格式

然后记录的信息去自由的控制格式,不同的等级不同的颜色等等

3框架开源

开源 的时候,小红起了个名字叫  log4j  , 受到广大程序猿的热烈欢迎。 

出现了一些变种,log4j……….

她去找jdk官方,想纳入jdk标准库里面,jdk官方没有看对眼,

但是随着框架的影响力越来越大,被apache公司看上了,然后看对眼了,小红收入变高了

后来Jdk官方自己开发了一个日志框架 ,叫做jul 就是java.util.logging这个jar包,但是为时已晚

这样就造成了非常混乱的现状:

这个开发者喜欢用jul,另一个喜欢log4j,还有什么jboss-logging

4整合日志框架
1)JUL出现

Jdk率先开发出了jcl, jakarta Commons Logging   JCL  ( 不实现日志功能,整合日志的)

用来整合日志的

代码里面我们这样写

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class JCLMain {

public static void main(String args[]){
Log log= LogFactory.getLog(JCLMain.class);
log.info("guanfang");
}
}

jcl默认的配置:如果能找到Log4j 则默认使用log4j 实现,如果没有则使用jul(jdk自带的) 实现,再没有则使用jcl内部提供的SimpleLog 实现。

这样有个问题

JCL动态查找机制进行日志实例化,执行顺序为:commons­logging.properties­­­­>系统环境变量­­­­­­­>log4j­­­>jul­­­>simplelog­­­­>nooplog

 

 如图所示:

日志那些事儿 _ Java侠

2)Slf4j的出现

小红发现并不好用,小红离开了apache,独自开发日志门面叫做  slf4j , ( 不实现日志功能,整合日志的)  

实际是一个适配器还就是个桥接器。好比追女孩 -通过闺蜜。。。

slf4j 是个桥接器     比jcl好一点,spring默认jcl,这是亲儿子

需要大量的桥接,slf4j本身,还有个适配器,桥接器   log4j  

适配器的概念,把jul转换到slf4j上面

模块1  Jul 用的 jcl的门面

模块2 比较崇尚开源  用的slf4j 桥接器  log4j

3)Log4j2和logback的出现

 apache  开发出了 log4j2 ,性能 比  log4j高出好多倍

小红认识到了开发出了 logback  ,性能  log4j高出好多倍

 

下面是表格展示

日志实现

日志门面

Log4j已经淘汰

JCL

Jul ---》java.util.logging

SLF4j

Log4j2

 

logback

 

然后是slf4j与其他各种日志组件的桥接说明

 

 

Jar包

说明

slf4j-log4j12-1.7.13.jar

Log4j1.2版本的桥接器,你需要将Log4j.jar加入Classpath。

log4j-slf4j-impl.jar

og4j2版本的桥接器,还需要log4j­api.jar log4j­core.jar

slf4j-nop-1.7.13.jar

java.util.logging的桥接器,Jdk原生日志框架。

slf4j-simple-1.7.13.jar

一个简单实现的桥接器,该实现输出所有事件到System.err. 只有Info以及高于该级别的消息被打印,在小 型应用中它也许是有用的。

 

 

如图所示,应用调了sl4j-api,即日志门面接口。日志门面接口本身通常并没有实际的日志输出能力,它底层还是需要去调用具体的日志框架API的,也就是实际上它需要跟具体的日志框架结合使用。由于具体日志框架比较多,而且互相也大都不兼容,日志门面接口要想实现与任意日志框架结合可能需要对应的桥接器,上图红框中的组件即是对应的各种桥接器!

 

我们在代码中需要写日志,变成下面这么写

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger(Test.class);

// 省略

logger.info("info");

 

 

那现在有个问题,如何将jcl转换成slf4j 

jcl-over-slf4j  这是个适配器

添加依赖后,如图:

<!--  -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.30</version>
</dependency>
jcl就会转换成slf4j

 

在代码中,并不会出现具体日志框架的api。程序根据classpath中的桥接器类型,和日志框架类型,判断出logger.info应该以什么框架输出!注意了,如果classpath中不小心引了两个桥接器,那会直接报错的!

因此,在阿里的开发手册上才有这么一条强制:应用中不可直接使用日志系统(log4j、logback)中的 API ,而应依赖使用日志框架 SLF4J 中的 API 。使用门面模式的日志框架,有利于维护和各个类的日志处理方式的统一。

 

作者:一枝梅1988
来源链接:https://www.cnblogs.com/yizhimei1988/p/14689125.html

标签: 日志框架

“日志那些事儿” 的相关文章

SpringBoot与日志

SpringBoot与日志

一、日志框架 ​ 1、市面上的日志框架:JUL、JCL(Apache 基金会的)、Jboss-logging、logback、log4j、log4j2、slf4j.......

Java日志框架中需要判断log.isDebugEnabled()吗?

Java日志框架中需要判断log.isDebugEnabled()吗?

背景 在日常开发中,项目会使用抽象日志接口slf4j来打印日志。如下是一段典型的打印日志代码: logger.debug("hello, world"); 但是在一些...

web项目中日志管理工具的使用

web项目中日志管理工具的使用

在web项目中,很多时候会用到日志管理工具,常见的日志管理用具有:JDK logging(配置文件:logging.properties) 和log4j(配置文件:log4j.prope...

[工具] slf4j-api、slf4j-log4j12以及log4j之间的关系

[工具] slf4j-api、slf4j-log4j12以及log4j之间的关系

几乎在每个jar包里都可以看到log4j的身影,在多个子工程构成项目中,slf4j相关的冲突时不时就跳出来让你不爽,那么slf4j-api、slf4j-log4j12还有log4j是什么...

slf4j log4j logback log4j2关系详解和相关用法

来源:slf4j log4j logback关系详解和相关用法 https://www.cnblogs.com/Sinte-Beuve/p/5758971.html  ...

JAVA日志系统

JAVA日志系统

1、一个小故事 我们先看一个故事。项目经理A带着一帮兄弟开发了一套复杂的企业ERP系统,这个系统一连开发了好几年,开发人员也换了好几拨。 阶段一:最开始的时候,项目经理A安排...

SpringBoot日志框架自动配置与原理

SpringBoot日志框架自动配置与原理

1、日志框架 小张;开发一个大型系统; ​ 1、System.out.println("");将关键数据打印在控制台;去掉?写在一个文件? ​ 2、框架来记录系统的一些...

🔥SpringBoot图文教程2—日志的使用「logback」「log4j」

🔥SpringBoot图文教程2—日志的使用「logback」「log4j」

有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试...

软件测试_面试问题收集记录

1.熟悉java语言吗?谈谈你对java的认识;比如java的基础类型 可以结合自身的情况,如果熟悉就讲熟悉,如果不知道就说你自己擅长的语言做脚本 如果自己有在自学java...

log4j的简介

---恢复内容开始---   问题的引入         把所有的信息打印在控制太上不行...