猩球崛起之程序员小站的变强之路-日志篇(一)
一:日志框架场景:
某项目开发人员维战,为了了解项目运行情况,在我们代码中加入了,System.out.println("*****")来记录 日志,有一天,项目经理觉得通过这种,System.out.println("*****")的方式很low,要他把把代码中 的,System.out.println给去掉,但是过了几天之后,项目出问题了,查询很棘手又没有日志,然后经理又要求他把System.out.println加上,。。。。。。。。然后又去掉。。。。。又加上.......
情况一:
维战是一个脾气暴躁的人,拿起板砖就跟经理干起来,然后牢底坐穿,,,全剧终,,,,,,, 没用案例场景,,,,,,下课。。。。。。
情况二:
维战为了解决System.out.println("*****")比较low的情况,然后就写了一个记录日志的jar包名称叫chn-tower-logging.jar用来替代 System.out.println("*****")
维战是一个爱专研的人,想出了一写比较牛逼的点子,,,,比如日志异步记录, 日志归档。。。。。。然后起名叫chn-tower-logging-good.jar,然后把项目中原来的chn-tower-logging.jar中的卸下来,然后安装新的框架chn-tower-logging-good.jar,
但是 由于二种方式实现的接口可能不一样,需要修改代码中的日志打印类。这种情况 这么办?
此时二蛋,想到了一个好的点子,我把chn-tower-logging.jar 和chn-tower-logging-good.jar的功能都抽取出来形成一个门面chn-tower-logging-intf.jar(也就是我们的接口)然后在二个日志框架中实现不同的功能.这样,我的业务代码中直接使用的是我们的chn-tower-logging-intf.jar的方法,然后根据需要导入了chn-tower-logging.jar或者chn-tower-logging-good.jar
二:我们Java中常用的日志框架是什么
2.1)我们常常听说的就是如下的日子框架,还不知道这么选?
①:JUL(java.util.logging) ,
②:JCL(Jakarta Commons-Logging) 由apache公司Jakarta 小组开发的,
③:JBoss-logging
④:logback
⑤:log4j
⑥:log4j2
⑦:slf4j(Simple Logging Facade for Java.)

我们Spring底层选择的是我们的这个JCL做为日志门面的
SpringBoot 选择的是 SLF4J做为我们的日志门面(当时log4j,和logback)他选择了logback
2.2)加入我们系统使用的是SLF4J作为日志门面,我们是如何匹配
①:app(我们的应用系统)+日志门面(Slf4j slf4j-api.jar)+不加我们的日志实现 不会记录日志
②:app(我们的应用系统)+日志门面(Slf4j slf4j-api.jar)+logback(logback-classic.jar,logback-core.jar)
③:app(我们的应用系统)+日志门面(Slf4j slf4j-api.jar)+适配器(因为早期log4j 压根不知道有一slf4j 的日志门面,所以降入适配器slf4j-log412.jar实现我们slf4j的接口,真正实现功能调用我们的log4j.jar)+log4j.jar
④:app(我们的应用系统)+日志门面(Slf4j slf4j-api.jar)+适配器(因为早期juc 压根不知道有一slf4j的日志门面,所以降入适配器slf4j-jdk14.jar实现我们slf4j的接口,真正实现功能调用我们的juc的jar包的功 能)+juc.jar
⑤:app(我们的应用系统)+日志门面(Slf4j slf4j-api.jar)+slf4j(slf4j-simple.jar)
第一种情况(我们业务系统直接使用的是spring底层用的日志框架jcl+jdk的日志实现)
1 <dependency> 2 <groupId>org.springframework</groupId> 3 <artifactId>spring-context</artifactId> 4 <version>4.3.20.RELEASE</version> 5 </dependency> 6 7 public class MainClass { 8 private static Logger logger = Logger.getLogger(MainClass.class.getName()); 9 public static void main(String[] args) { 10 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class); 11 12 logger.info("hello zhangjiang"); 13 ctx.start(); 14 } 15 }
打印的日志格式是:(我们发现都是红色的)

第二种情况:(我们往pom依赖中加入log4j的包以及加入log4j的配置文件,spring 底层的日志门面使用的是jcl,实现貌似使用了是log4j的格式)
1 <dependency> 2 <groupId>org.springframework</groupId> 3 <artifactId>spring-context</artifactId> 4 <version>4.3.20.RELEASE</version> 5 </dependency> 6 7 <!--log4j的日志--> 8 <dependency> 9 <groupId>log4j</groupId> 10 <artifactId>log4j</artifactId> 11 <version>1.2.17</version> 12 </dependency> 13 14 import org.apache.log4j.Logger; 15 16 private static Logger logger = Logger.getLogger(MainClass.class.getName()); 17 public static void main(String[] args) { 18 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class); 19 20 logger.info("hello zhangjiang"); 21 ctx.start(); 22 }
日志打印情况:

系统和我们自己的都是log4j格式

浙公网安备 33010602011771号