搭建日志分析系统

核心提示Java 中日志相关的 jar 包非常多,log4j、log4j2、commons-logging、logback、slf4j 等,本文首先梳理这些包之间关系,然后介绍在 spring boot 中日志的配置,最后介绍多环境的配置。1 日志

Java日志相关的jar包有很多,比如log4j、log4j2、commons-logging、logback、slf4j等。本文首先梳理了这些包之间的关系,然后介绍了spring boot中日志的配置,最后介绍了多种环境的配置。

1个日志帧历史

1.1 log4j

很多年前,一个叫Ceki Gülcü的大个子在一个项目中开发了一个跟踪API。这个跟踪API逐渐演变成log4j,大约在1999年成为Apache的成员。

7月1.2日

JUL:java.util.logging

我觉得Apache log4j很有价值,所以推荐给SUN公司,希望SUN公司把log4j加到JDK。SUN公司认为JDK有必要加入log4j,但又看不上Log4j,于是自己做了一套官方的,2002年在JDK 1.4中实现了JUL。

此时市面上有两套日志API:Apache的log4j和官方的JUL。

1.3 JCL和简单日志

JCL:雅加达公共日志。

Log4j和JUL是两种不同的API。一个出现的比较早,一个是官方的,两个用户群体都比较大。如果要在一个项目中切换日志框架,需要改很多代码,也不符合“面向接口编程”的设计原则。Apache推出了JCL项目,名字看起来很高大上,但是这个东西在SSH和SSM时报上随处可见,也就是构建框架时经常看到的commons-logging包。这个项目是一组日志的抽象层。所谓“抽象层”,本质上就是一堆接口。如果你有接口,你需要实现。不实现就自娱自乐,不会用。所以Apache为JCL提供了一个默认的实现,就是简单的日志。

JCL基于动态绑定实现日志记录:开发过程中使用JCL定义的接口,程序运行时使用类路径中的具体实现。

与JDBC相比,Java正式制定了数据库访问层持久化操作的标准JDBC,各个数据库厂商都执行了这个标准。JCL也想成为规范制定者,统一日志操作的规范。

随着JCL的出现,日志系统更加优雅,面向JCL的接口编程可以轻松切换日志框架。此时log4j的父亲Ceki因为某种不为人知的原因离开了阿帕奇。

1.4 slf4j

slf4j:Java的简单日志门面。

大多数写代码的人都有一个共同点:别人写的都是垃圾,昨天写的都是垃圾,只有现在写的才是最好的。师兄Ceki也觉得JCL不是特别完美,于是做了一个新版本的日志接口:slf4j。

问题来了。只有slf4j的接口没有实现。有必要让log4j和JUL都实现slf4j吗?肯定是不可能的。

JCL采用动态绑定机制,slf4j采用“桥包”,即分别开发log4j和JUL的桥包,用桥包来适配两者。Daniel,Ceki提供了这些桥接包slf4j-log4j,slf4j-jdk14等。由于JCL比slf4j出现的早,很多项目都使用JCL,所以这位大佬也提供了slf4j-jcl。

还有一个常见的:一个项目中使用第三方框架,使用slf4j和log4j,而依赖的第三方框架使用JCL和JUL,此时系统会有两个日志配置文件和两种打印方式,会比较乱。Ceki Gülcü也考虑了这个场景,没有他的桥包处理不了的场景,所以他得到了一个jcl-over-slf4j桥包。...

1.5回退

Ceki Gülcü得到了slf4j和一堆桥接包,并在2006年为slf4j提供了一个强大的实现:logback。同时,他还专门写了一篇文章《相比log4j更喜欢logback的理由》。毕竟log4j也出自他手,他最清楚这里面存在什么问题。事实上,logback的性能和设计确实比log4j好,所以它与时俱进。

1.6 log4j2

logback的出现让阿帕奇坐不住了。2012年,启动了一个新项目log4j2。看起来是log4j的升级版,其实是全新的东西。和log4j不兼容。Log4j2几乎包含了logback的特性。竞争是残酷的。和slf4j类似,log4j2也想统一日志的世界,也弄了一堆桥接包,log4j-xxx用来兼容上面的各种日志框架。...

乱七八糟扯了一堆,核心是三个概念:

期刊:JCL,slf4j

日志产品:log4j、JUL、logback、log4j2

包装:slf4j-xxx,log4j-xxx

2 Spring Boot日志配置

默认情况下,Spring Boot的底层使用slf4j和logback来记录日志。我们的演示项目依赖于spring-boot-starter-web,也依赖于spring-boot-starter-logging,所以不需要手动添加这个依赖。

在Spring Boot,application.yml支持一些logbacks的日志配置,但是一些高级配置只能通过独立的xml配置文件来实现。集成Spring Boot后,可以支持多环境配置,但logback配置文件需要命名为logback-spring.xml如果使用自定义日志配置文件,application.yml中的日志配置将无效。

2.1 spring boot的默认登录配置

SpringBoot默认提供了一组logback配置文件,位于spring-boot依赖中的org/spring framework/boot/logging/log back/base . XML。

该文件引入了三个xml文件,并将root的日志级别设置为info。日志的附加器在CONSOLE-appender.xml和FILE-appender.xml中定义,分别是名为CONSOLE的控制台附加器和名为FILE的文件附加器。

org/spring framework/boot/logging/logback/defaults . XML定义了log back的转换器,一些包的日志级别以及日志显示格式。

默认情况下,颜色日志显示在控制台中,因为使用了转换器ColorConverter,并且显示的格式是CONSOLE_LOG_PATTERN,该格式在该转换器中使用。

这个default.xml和console-appender.xml可以在我们的定制配置中重用。

2.2定制配置

在src/main/resources/下创建配置文件logback-spring.xml。

< xml版本="1.0 "编码="UTF-8 " >

上面的配置介绍了spring boot中logback和ConSOLE appender的默认配置,并将root的日志级别定义为info。

2.3日志级别

有五个级别的日志:跟踪、调试、信息、警告和错误,它们的顺序更高。如果配置了某个级别,就会输出该级别及以上。例如,如果配置日志级别是warn,日志将输出warn和error;如果配置日志级别为调试,将输出调试、信息、警告和错误。

在DemoController的hello方法中添加日志输出以测试日志级别:

@ rest controller @ requestmapping public class demo controller { private Logger Logger = Logger factory . get Logger;@GetMapping公共字符串hello { String result = "你好Spring Boot!"+msg;system . out . println;logger.errorlogger.warnlogger.infologger.debuglogger.trace返回结果;}}

注意,引入的Logger和LoggerFactory类都在slf4j包下。上面的代码分别输出五个级别的日志。启动服务,访问hello界面,控制台输出:

控制台输出信息、警告和错误。可以看出SpringBoot的默认输出级别是info。您可以通过配置精细粒度来调整日志的级别:

< xml版本="1.0 "编码="UTF-8 " >......

上面根据包名改变了日志的显示级别,com.yygnb.demo包下的日志都是trace级别。再次访问hello接口,所有的错误、警告、信息、调试和跟踪都将被打印出来。

如果使用lombok,您可以直接在代码中使用log对象,而无需手动创建logger对象。使用注释@Slf4j后:

@ Slf4j @ rest controller @ requestmapping public class demo controller { @ get mapping public String Hello { String result = " Hello Spring Boot!"+msg;system . out . println;log.errorlog.warnlog.infolog.debuglog.trace返回结果;}}

关于该不该用lombok,网上有各种有理有据,牵强附会的说辞,甚至有标题党写着“我公司xxxx技术总监规定”。我只能说,符合公司或项目规定就够了。

2.4文件附件

SpringBoot附带的控制台附加器控制台在上面被重用,这里文件附加器被定制:

...INFO % d { yyyy-MM-DD HH:MM:ss }[% thread]%-5 level % logger { 50 }-% msg % n logs/hero-spring boot-demo。%d.log 100...

并将这个自定义文件附加器添加到根目录:

上面的文件附加器,日志路径是项目根路径下的logs目录,日志名如hero-spring boot-demo . 2022-08-02 . log,启动服务,访问hello接口,测试日志文件是否生成。

2.5多环境日志

假设当您在本地时,只输出控制台日志;在其他环境中输出控制台日志和文件日志。SpringBoot提供了springProfile标签,它通过这个元素的name属性来指定环境。修改根元素:

分别用local和dev启动服务,测试多环境是否有效。

我们自定义的logback-spring.xml充分利用了Spring Boot官方提供的配置,最终完整的配置如下:

< XML version = " 1.0 " encoding = " UTF-8 " >信息% d { yyyy-MM-DD HH:MM:ss }[% thread]%-5级别% logger { 50 }-% msg % n logs/hero-spring boot-demo。%d.log 100

作者:程序员优雅哥

资料来源:file/tupian/20220910/16588510.html

 
友情链接
鄂ICP备19019357号-22