首页 > 其他分享 >SpringBoot 1x 系列之(三)SpringBoot与日志

SpringBoot 1x 系列之(三)SpringBoot与日志

时间:2024-02-28 10:14:03浏览次数:22  
标签:logging SpringBoot 框架 1x slf4j 日志 配置文件

SpringBoot与日志

日志框架、日志配置

1. 日志框架

JDBC和数据库驱动:
JDBC是统一的接口层(抽象层),面向JDBC进行开发,而不直接面向数据库驱动,这样的好处是数据库驱动会不断的出现新产品,如果直接面向数据库驱动开发,那么,每次更换数据库驱动,开发的代码就要做相应的调整,而面向JDBC开发,不管换成什么数据库驱动,我们的代码都不需要再改了

日志框架也是沿用了JDBC和数据库驱动的思维,与他们相对于,分为日志门面(JDBC)和日志实现(数据库驱动)。

我们在使用日志框架时,就从日志门面中选一个,再从日志实现中选一个,就可以进行开发了。

目前常见的日志门面和日志实现如下
在这里插入图片描述
SpringBoot的底层是Spring,Spring的日志门面选用的是JCL,而SpringBoot选用的是SLF4j+Logback

1.1 slf4j使用原理

1.1.1 如何在项目中使用SLF4j

  1. 以后开发的时候,日志记录方法的调用,不应该直接调用日志实现的方法,而是调用日志门面(抽象层)的方法
  2. 在项目中导入SLF4j的jar和Logback的实现jar
    使用示例:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

在这里插入图片描述

  1. 每一个日志实现框架都有自己的配置文件,使用slf4j以后,配置文件还是使用日志实现框架本身的配置文件。

1.2 遗留问题(其他日志框架统一转换为slf4j)

问题:我们在开发系统时,假如日志框架选用了SLF4j+Logback,但当前系统又依赖于其他框架,比如Spring、Hibernate、MyBatis、...,依赖的这些框架有的又会依赖自己的日志框架,比如Spring依赖JCL,Hibernate依赖Jboss-logging,这样就出现了日志框架不统一的问题,项目依赖于多个框架,而每个框架会有自己的日志门面和日志实现
我们的解决方法是:让系统中所有的日志框架都统一到SLF4j。

  1. 将系统中其他日志框架排除出去
  2. 用原有日志框架的中间包来替换原有的日志框架
  3. 使用我们选定的日志实现框架

在这里插入图片描述

1.3 SpringBoot日志关系

SpringBoot使用spring-boot-starter-logging来做日志功能。
SpringBoot在底层的日志依赖关系
在这里插入图片描述

总结:

  1. Spring Boot底层使用slf4j+logback的方式进行日志记录
  2. Spring Boot也把其他的日志框架都替换成了slf4j(导入了中间包,统一框架)
  3. 如果我们要引入其他框架,一定要把这个框架的默认日志框架依赖移除掉
    比如,我们使用了Spring框架,就要这么做
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-core</artifactId>
	<exclusions>
		<exclusion>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

注:SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉。

2. SLF4j+Logback日志使用

2.1 日志级别

TRACE
DEBUG
INFO
WARN
ERROR
注:上述级别自上而下由低到高,我们设定日志级别后,日志输出时只会输出设定级别及以上级别的日志信息。
在这里插入图片描述

2.2 默认配置

SpringBoot默认配置好了日志,默认的日志级别是INFO,通过logging.level指定了包的日志级别的就用指定的,没有指定的包就用SpringBoot默认规定的级别:root级别
在这里插入图片描述

2.3 常用配置

日志的默认配置是在主配置文件里的,所以我们要修改默认配置,也需要在主配置文件中修改

2.3.1 logging.level.XXX

设置某个包/类的日志级别,XXX写包/类结构,值为五个日志级别之一

2.3.2 logging.file

生成日志文件,不指定路径只给出日志文件名默认在当前项目根目录下生成
在这里插入图片描述
指定具体路径,在指定路径下生成日志文件

2.3.3 logging.path

在指定路径下生成日志文件,日志文件默认文件名为springboot.log
在这里插入图片描述
注:当同时指定logging.file和logging.path,生效的总是logging.file

2.3.4 logging.pattern.console和logging.pattern.file

logging.pattern.console 指定控制台输出的日志格式
logging.pattern.file 指定日志文件输出的日志格式
在这里插入图片描述

日志格式参考
在这里插入图片描述
示例如下
在这里插入图片描述

2.4 自定义日志配置文件

给类路径下放上每个日志框架自己的配置文件即可,这样,Spring Boot就不会使用自己的默认配置了

每个日志实现框架与配置文件的对应关系如下
在这里插入图片描述
logback.xml和logback-spring.xml的区别
logback.xml会绕过SpringBoot,直接被日志框架识别
logback-spring.xml由Spring Boot解析,可以使用SpringBoot提供的日志Profile功能(日志的多环境配置)
在这里插入图片描述
注:上述代码直接在相应的日志配置文件中使用即可,Spring Boot会对这部分内容进行解析。
示例
在这里插入图片描述

2.5 切换日志框架

spring-boot-starter-logging的底层是slf4j+Logback,假如我们需要切换为其他的日志框架组合,该怎么做呢,有两种方式可以实现。

  1. 根据slf4j的日志适配图
    以slf4j+Logback转为slf4j+log4j(reload4j)为例进行说明
    在这里插入图片描述
    注:图中的reload4j就是log4j
    首先将log4j-over-slf4j和logback-classic排除掉
    在这里插入图片描述
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>logback-classic</artifactId>
            <groupId>ch.qos.logback</groupId>
        </exclusion>
        <exclusion>
            <artifactId>log4j-over-slf4j</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

然后增加log4j适配包
在这里插入图片描述

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-reload4j</artifactId>
    <version>1.7.35</version>
</dependency>

如果需要自定义log4j的配置文件,再把log4j的配置文件放到类路径下就可以,否则就用Spring Boot默认的

  1. 场景启动器
    以slf4j+Logback转为slf4j+log4j2为例进行说明
    在这里插入图片描述
    首先排除掉spring-boot-starter-logging
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-logging</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>

然后引入spring-boot-starter-log4j2即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

如果需要自定义log4j2的配置文件,再把log4j2的配置文件放到类路径下就可以,否则就用Spring Boot默认的

排除jar包时,可以使用IDEA的依赖视图快速排除,pom文件下右键点击Diagrams 》Show Dendendencies
在这里插入图片描述
选中要排除的jar包,右键点击Exclude即可,然后重新加载maven依赖
在这里插入图片描述

标签:logging,SpringBoot,框架,1x,slf4j,日志,配置文件
From: https://www.cnblogs.com/wzzzj/p/18039112

相关文章

  • SpringBoot 1x 系列之(二)SpringBoot 配置
    SpringBoot配置配置文件、加载顺序、配置原理1.配置文件SpringBoot默认使用两种类型的配置文件作为一个全局配置文件,配置文件名固定,用于修改SpringBoot自动配置的默认值application.propertiesapplication.y(a)ml1.1YAML简介YAML(YAMLAin'tMarkupLanguage)递归缩写......
  • SpringBoot 1x 系列之(一)SpringBoot 入门
    SpringBoot入门SpringBoot和微服务概念的简介、SpringBootHelloWorld入门程序、内部原理1.SpringBoot简介简化Spring应用开发(整个J2EE开发)的一个框架整个Spring技术栈的一个大整合.........J2EE开发的一站式解决方案注:SpringBoot使用嵌入式的Servlet容器,应用无......
  • springboot学习过程中的特殊错误
     这是我在学习使用springboot过程中遇到的一个小问题,询问了gpt但是并没有解决我的报错,在网上浏览信息后最终知道了是哪里出了问题 就如这个好哥哥说的一样,mybatis自带的方法不会出现问题,所以问题出在了实体类定义上面,加了@Tableld的注解就解决了问题。......
  • springboot 统一处理请求非法参数
    通过拦截器和过滤器实现,话不多说上代码。1、重写HttpServletRequestWrapper读取body里面的内容。publicclassRequestWrapperextendsHttpServletRequestWrapper{privatefinalStringbody;publicRequestWrapper(HttpServletRequestrequest){super......
  • 【教程】iOS上获取崩溃日志的N+1种方法
     引言在移动应用开发过程中,经常会遇到应用程序崩溃的情况。为了更好地排查和解决这些崩溃问题,获取崩溃日志是至关重要的。本文将介绍多种在iOS设备上获取崩溃日志的方法,帮助开发者快速定位问题并进行修复。摘要本文介绍了在iOS设备上获取崩溃日志的多种方法,包括从系统设置中......
  • Oracle设置日志参数-ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
    要实现两个数据库之间的实时同步,需要给Oracle设置参数ALTERDATABASEADDSUPPLEMENTALLOGDATA;--执行了12小时,等待数据库中的其它事务都提交以后才执行完成ALTERDATABASEADDSUPPLEMENTALLOGDATA(PRIMARYKEY)COLUMNS;ALTERDATABASEADDSUPPLEMENTALLOGDATA(......
  • 捕获全局异常,并且把异常信息打印到日志中
    背景:工作中用到一些脚本,脚本把日志记录到文件中。新需求修改脚本后,难免引入一些异常,执行脚本会报错,但是日志文件中没有报错的详细信息,很难排查。1、不使用sys.excepthook时,执行下面代码会抛出异常,日志文件example.log不会记录异常信息。 #coding:utf-8importsysimportlog......
  • 弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙
    作者:潘伟龙(豁朗)背景日志服务SLS是云原生观测与分析平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务,基于日志服务的便捷的数据接入能力,可以将系统日志、业务日志等接入SLS进行存储、分析;阿里云Flink是阿里云基于ApacheFlink构建的大数据分析平台......
  • springboot2.6开始禁止循环依赖了
    参考文章: https://mp.weixin.qq.com/s?__biz=MzI0MTUwOTgyOQ==&mid=2247497189&idx=1&sn=0f03cdafad9bacef66c64a490b85ff23&scene=21#wechat_redirect使用了SpringBoot2.6及以上版本的,如果要允许循环依赖,可以作如下设置:方案二:允许循环引用此方案更像是绕过问题而非解决问题......
  • NLog条件配置——实现将包含某个特定字符串日志写入指定文件
    需求产生缘由在开发中为了了解程序在运行的内存状态并记录下来,以便出问题时判断是不是与内存相关。于是实时采集了开发程序需要的内存信息。但采集的内存信息在存储时,以NLog中的Trace级别来存储的话,会与程序其它Trace级别的日志都记录在相同的TraceLog文件下,这会导致在查看内存......