Java日志框架(过于简陋,不如我的csdn上的java日志文章)

日志介绍

什么是日志框架?什么是日志?该怎么使用日志?

我们知道在写java程序的时候我们经常调试,会写一些sout语句,将一些东西打印在控制台

我们通过查看控制台的输出来判断程序在这个时间有没有出问题

但是这样的方式有几个缺点

  1. 调试语句sout嵌入到开发程序中,难以分离

  2. 输出格式混乱,难以正确,快速识别信息

  3. 无法保存到文件

  4. 性能低下

所以日志框架就是用来收集程序运行过程中的信息,保存起来的文件

现在日志框架分为日志门面和日志实现两部分

Java日志框架历史

java的日志框架历史原因很大,现在学习java日志框架几乎必须知道这段历史

最开始java没有自己的日志框架,也就是java没有设计日志功能,只是使用最简单的控制台输出

后来出现了log4j项目,一经发布就大受欢迎

后来sun公司意识到不对,所以给自己的jdk开发了一套日志框架集成在jdk中,叫做JUL也就是java.util.logging包

但是sun公司的日志框架做的很烂

apache发现这两个框架使用区别很大,就推出了一套抽象接口jcl,来调用这个log4j和jul,传入这两个框架的对象,生成一个jcl的对象(叫做适配器技术)

但是这个jcl解决的问题,还没有他产生的问题多

所以就出现另一款接口,叫做slf4j这个日志门面非常好,作者直接提供了

img

三座桥,使得这三个都可以转到slf4j来调用

slf4j解决多套日志系统的问题

如果我们的项目使用的是slf4j,而我们项目中的一些框架,第三方库使用的是其他日志框架,那怎么办?

slf4j提供了新的jar包,模拟实现了其他日志框架的所有的接口,将内部实现变成了对slf4j的调用

这样我们就不需要改框架的代码,只需要把框架依赖的jar包冲掉即可

如果使用了日志接口框架,就使用over覆盖jar包,如果调用的是jul就直接redirect to slf4j

SLF4j的好处

  1. 使用{}占位符,代替字符串拼接

之前的日志框架,只能在参数中使用+来连接字符串,导致每次执行到代码,都要执行连接字符串操作,到了内部判断发现输出级别不够,我连接好的字符串根本用不到,所以日志实现实际上都先进行日志级别判断,在进行耗时操作

日志级别

不同的日志级别保持平行,可以看做不同的日志级别在不同的输出窗口里面

  1. trace 追踪信息 最多
  2. debug 调试信息 最常用
  3. info 关键信息 默认打印级别,比这个级别低的都会打印
  4. warn 警告信息 不常见
  5. error 错误信息 最少见

实现方式

通过将sout这样的函数,换成一个logger对象的info,debug之类的函数,这个logger对象根据配置生成,将这些信息打印到指定的输出流中

所以关键的思想就是如何实现这个logger

AOP动态代理辅助打印日志

想要在函数返回之前,打印函数输出,但是函数输出有多处分支,我们要写多个一样的代码,这个时候使用动态代理就很方便了

SLF4J日志门面

主要是给java访问提供了一套标准,规范的API框架,当然SLF4J也提供了一点点自己的简单实现

主要的意义是提供接口

1
2
3
4
5
logger.trace("This is a TRACE message");
logger.debug("This is a DEBUG message");
logger.info("This is an INFO message");
logger.warn("This is a WARN message");
logger.error("This is an ERROR message");

这些接口

获取logger通过

1
Logger logger = LoggerFactory.getLogger(logger所在类的class对象);

Log4j2日志实现

新手上路

log4j2在使用之前需要先指定配置文件

Log4j2 会去寻找 4 种类型的配置文件,后缀分别是 properties、yaml、json 和 xml。前缀是 log4j2-test 或者 log4j2。

所以我们需要在resources目录下添加配置文件,log4j2-config.lo4j2

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="DEBUG">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

Java日志框架(过于简陋,不如我的csdn上的java日志文章)
https://wainyz.online/wainyz/2024/03/31/Java日志框架(过于简陋,不如我的csdn上的java日志文章)/
作者
wainyz
发布于
2024年3月31日
许可协议