SpringBoot中的日志框架
学习视频:拉钩教育
日志是什么?
日志是一个记录事件的组件,无论是记录运行情况还是追踪线上问题,都需要分析日志。
为什么需要日志框架?
场景演变:
1、最初时利用System.out.println("msg")来输出关键信息到控制台
2、当需要隐藏一些信息就需要手动注释掉代码
3、当关键信息不需要输出到控制台而是文件中,方便后续跟踪,则又需要统一修改代码
4、此时可以初步实现一个日志框架1.0版本
5、当需要日志记录不会阻塞程序的运行,或者统一归档,又或者按照时间来分类记录
6、此时需要开发一个日志框架2.0
7、同时需要替换原来的jar包,这就需要修改相关的API,这样每次更新都要频繁的修改API
8、借鉴JDBC和数据库驱动的思想,我们需要设计一个统一的接口API和不同的API实现,这样在不修改源代码的基础上只需更换API的实现jar包就可以更改底层实现逻辑
常见的日志框架
- 日志抽象层:JCL、SLF4J、jboss-logging
- 日志实现层:jul、log4j、logback、log4j2
分析:
jboss-logging-----对于特定框架来使用
JCL-----已经不更新了
jul-----功能不够强大
log4j-----存在性能问题
logback-----优化log4j新产生的实现
log4j2-----功能强大,根据Slf4j+logback进行开发的项目(既规定了接口log4j-api又有实现log4j-core)
Spring框架默认使用JCL(Commmons logging)作为日志输出
SpringBoot采用的日志框架为:日志抽象层SLF4J + 具体实现logback
SLF4J的使用
首先导入SLF4J的jar包
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
// 创建一个记录器,用来专门记录HelloWorld.class类的相关信息
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
// 日志输出
logger.info("Hello World");
}
}
使用SLF4J结合不同的日志实现
- SLF4始终作为日志门面,绑定log4j和jul时需要引入适配工具 Adaptation layer,
- 每个日志实现框架都有自己的配置文件,所以在使用SLF4J之后还需要使用日志实现的配置文件。
统一日志框架
在项目中会使用其他第三方框架,他们默认会引入其他的日志实现,导致项目中的日志实现jar包有多又乱,所以需要统一日志框架:
- 排除项目中其他日志框架
- 使用中间包替换排除的日志框架
- 引入需要统一的日志框架
SpringBoot中默认是SLF4J+logback,已经完成其他日志框架的排除,比如:
通过<exclusions>和<exclusion>标签排除Commons-logging实现
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-console</artifactId>
<version>${activemq.version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
使用
yaml中日志级别配置
日志级别:trace < debug < info(默认) < warn < error < fatal,低于设置日志级别的日志不会输出,若全局日志级别改成 trace,则系统所有的日志都能看到
logging:
level:
root:info # 没有指定日志级别的包会跟随根记录器的设置
com.example.demo: trace #com.example.demo为包名
- trace是最低优先级的日志,一般用来追踪详细的程序运行流,比如程序的运行过程中,运行到了哪一个方法,进入了哪一条分支。
public void method1(){
log.trace("method1");
...
}
- debug是比trace高一级别的日志,该级别的日志就是用来debug用的。这类日志往往用在判断是否有出现bug的场景,为了记录信息往往记录了代码运行的详细信息,比如方法调用传入的参数信息。
public void method2(int param){
log.trace("method1");
log.debug("param");
...
}
- info比debug高一级别,用来记录程序运行的一些关键信息,它不像trace那样记录程序运行的整个流程,也不像debug那样为了解决问题而记录详细的信息。info记录的是整个系统的运行信息,比如系统运行到了哪一个阶段,到达了哪一个状态。
public void method3(){
...
log.info("xxxx is ok!");
}
- warn比info的级别更高,用来记录一些警告信息。警告信息表示,程序进入了一个特殊的状态,在该状态下程序可以继续运行,但是不建议让程序进入该状态,因为该状态可能导致结果出现问题。
public void method4(){
...
if(出现不推荐的情况,但也可以使用){
log.warn("warning msg!");
}
}
- error级别的日志是最高优先级了,用来记录运行时的错误信息,表示程序运行过程中出现了需要被解决的问题,往往是一些异常。使用error日志的时候,一般会将详细的异常出现的原因记录。
public void method5(){
try{
...
} catch(Exception e) {
log.error(msg, e.getCause());
}
}
yaml中日志输出格式
默认输出格式
2022-11-26 09:58:01.627 INFO 38324 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-11-26 09:58:01.627 INFO 38324 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 710 ms
2022-11-26 09:58:01.833 INFO 38324 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-11-26 09:58:01.839 INFO 38324 --- [ main] c.e.s.SpringbootDemoApplication : Started SpringbootDemoApplication in 1.212 seconds (JVM running for 1.732)
即,指定控制台日志输出格式
logging:
pattern:
console:%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n
其中,关键字段有:
%d{yyyy-MM-dd HH:mm:ss.SSS}:日期
%-5level:日志级别
%thread:日志线程
%logger:日志输出的类名
%msg:日志输出内容
格式设置有:
%highlight():颜色,info为蓝色,warn为浅红,error为加粗红,debug为黑色
%15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符
%-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符
%n:换行符
yaml中日志输出路径
# 二者规定其一,若同时指定以第一种为准
logging:
file:
name:my.log # 在指定目录下生成自定义文件名文件
# 或者
logging:
file:
path:/var/log # 在指定目录下生成spring.log文件
指定日志文件的输出格式
logging:
pattern:
file:%d{yyyy-MM-dd HH:mm:ss.SSS} ==== %-5level ==== [%thread] ==== %logger{40} : %msg%n
SpringBoot替换日志框架
1、排除父依赖中的spring-boot-starter-logging
2、添加新的依赖
自定义日志配置文件 logback-spring.xml设置
分类:
编程开发学习
标签:
日志框架
, SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)