Java日志框架(过于简陋,不如我的csdn上的java日志文章)
日志介绍
什么是日志框架?什么是日志?该怎么使用日志?
我们知道在写java程序的时候我们经常调试,会写一些sout语句,将一些东西打印在控制台
我们通过查看控制台的输出来判断程序在这个时间有没有出问题
但是这样的方式有几个缺点
调试语句sout嵌入到开发程序中,难以分离
输出格式混乱,难以正确,快速识别信息
无法保存到文件
性能低下
所以日志框架就是用来收集程序运行过程中的信息,保存起来的文件
现在日志框架分为日志门面和日志实现两部分
Java日志框架历史
java的日志框架历史原因很大,现在学习java日志框架几乎必须知道这段历史
最开始java没有自己的日志框架,也就是java没有设计日志功能,只是使用最简单的控制台输出
后来出现了log4j项目,一经发布就大受欢迎
后来sun公司意识到不对,所以给自己的jdk开发了一套日志框架集成在jdk中,叫做JUL也就是java.util.logging包
但是sun公司的日志框架做的很烂
apache发现这两个框架使用区别很大,就推出了一套抽象接口jcl,来调用这个log4j和jul,传入这两个框架的对象,生成一个jcl的对象(叫做适配器技术)
但是这个jcl解决的问题,还没有他产生的问题多
所以就出现另一款接口,叫做slf4j这个日志门面非常好,作者直接提供了
三座桥,使得这三个都可以转到slf4j来调用
slf4j解决多套日志系统的问题
如果我们的项目使用的是slf4j,而我们项目中的一些框架,第三方库使用的是其他日志框架,那怎么办?
slf4j提供了新的jar包,模拟实现了其他日志框架的所有的接口,将内部实现变成了对slf4j的调用
这样我们就不需要改框架的代码,只需要把框架依赖的jar包冲掉即可
如果使用了日志接口框架,就使用over覆盖jar包,如果调用的是jul就直接redirect to slf4j
SLF4j的好处
- 使用
{}
占位符,代替字符串拼接
之前的日志框架,只能在参数中使用+来连接字符串,导致每次执行到代码,都要执行连接字符串操作,到了内部判断发现输出级别不够,我连接好的字符串根本用不到,所以日志实现实际上都先进行日志级别判断,在进行耗时操作
日志级别
不同的日志级别保持平行,可以看做不同的日志级别在不同的输出窗口里面
- trace 追踪信息 最多
- debug 调试信息 最常用
- info 关键信息 默认打印级别,比这个级别低的都会打印
- warn 警告信息 不常见
- error 错误信息 最少见
实现方式
通过将sout这样的函数,换成一个logger对象的info,debug之类的函数,这个logger对象根据配置生成,将这些信息打印到指定的输出流中
所以关键的思想就是如何实现这个logger
AOP动态代理辅助打印日志
想要在函数返回之前,打印函数输出,但是函数输出有多处分支,我们要写多个一样的代码,这个时候使用动态代理就很方便了
SLF4J日志门面
主要是给java访问提供了一套标准,规范的API框架,当然SLF4J也提供了一点点自己的简单实现
主要的意义是提供接口
1 |
|
这些接口
获取logger通过
1 |
|
Log4j2日志实现
新手上路
log4j2在使用之前需要先指定配置文件
Log4j2 会去寻找 4 种类型的配置文件,后缀分别是 properties、yaml、json 和 xml。前缀是 log4j2-test 或者 log4j2。
所以我们需要在resources目录下添加配置文件,log4j2-config.lo4j2
1 |
|