23、springboot日志使用入门-- SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件

这篇具有很好参考价值的文章主要介绍了23、springboot日志使用入门-- SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

springboot日志使用入门

★ 典型的Spring Boot日志依赖:

 spring-boot-start.jar   
     -- spring-boot-starter-logging.jar (Spring Boot的日志包)
          -- logback(core、classic)
          -- log4j-to-slf4j.jar
          -- jul-to-slf4j.jar

就是springboot的默认的日志依赖实现。创建项目的时候存在这个依赖里面。
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

★ Java领域的日志框架可分为:

▲ 门面类(抽象层):SLF4J、JCL(Apache commons logging)、JBoss Logging

▲ 日志实现:Log4j、Log4j2、Logback、JUL(JDK内置的java.util.logging)

推荐应用程序面向日志门面编程,以便底层可以在不同的日志实现之间自由切换。

项目中的日志框架,通常是两个:日志门面(抽象)+ 日志实现

★ Spring Boot的日志设计

下面的日志实现就是基于 SLF4J+Logback
SLF4J+Logback:SLF4J是门面,Logback是实现

▲ Spring Boot日志采用如下组合:

- SLF4J+Logback:SLF4J是门面,Logback是实现

▲ 由于Spring Boot要整合大量其他框架,这些框架底层可能采用了各种不同的日志实现,
    因此Spring Boot需要将这些日志全部“路由”给SLF4J(把所有日志统一交给SLF4J来输出),
    以后开发者就只需要设置SLF4J的日志即可。

   因此还需要
   - log4j-to-slf4j.jar:它负责将Log4j日志路由到SLF4J。
   - jul-to-slf4j.jar:负责将JUL日志路由到SLF4J。


 【说明】:当你项目用了Spring Boot之后,Spring boot会负责将所有第三方框架日志都路由给SLF4J,
        开发者就只需要配置SLF4J日志,即可对所有的日志进行全盘控制。

 【注意】:将Spring Boot应用部署到服务器上,JUL生成的日志将不再路由到Spring Boot应用的日志。
         ——由于应用服务器底层往往都使用JUL日志,由于应用服务器本身、及服务器上可能部署了其他应用的日志
         这些日志当然与我们Spring Boot应用无关,所以Spring Boot默认不会将这些日志路由到SLF4J上。


 【总结】 Spring Boot统一了Java领域的所有框架所可能用到的日志实现,并将这些日志全部“路由”给SLF4J来管理,
          因此开发者只要管理SLF4J日志,即可对项目中所有日志框架进行管理。

★ 使用日志:

(1)在程序中获取Logger对象(org.slf4j包下的),通过LoggerFactory。
     也可用Lombok的@Slf4j注解来获取。

(2)在要输出日志的地方(相当于以前Systme.out.println)
     Logger的trace\debug\info\warn\error来输出不同级别的日志。

★ 日志级别

▲ 日志级别:
  
  TRACE < DEBUG < INFO < WARNING < ERROR


▲ 当日志输出方法的级别高于或等于应用日志的设置级别时,该日志才会实际输出。

   Spring Boot应用默认的日志级别是INFO,因此它默认只输出info、warn、error方法输出的日志。

★ 设置日志级别:

设置日志的级别,可通过以下方式:

▲ 改变Spring Boot的核心日志级别

  通过debug=true或trace=true等属性(通过配置文件、命令行参数、系统变量、OS环境变量等方式)

  改变整个Spring Boot核心的日志级别。

▲ 改变程序组件(包括所有各种框架)的核心日志级别

  通过logging.level.<logger-name>=<level>属性(可通过配置文件、命令行参数、系统变量等方式)设置指定日志的日志级别。

 其中<logger-name>代表日志名,通常就是包名或全限定的类名,
  如果<logger-name>使用包名,那就意味着对该包下所有类统一设置日志级别。
  如果<logger-name>使用类名,那就意味着对该类设置日志级别。

而level则可以是trace、debug、info、warn和error等级别。

【小技巧】实际项目开发时,尽量避免使用System.out.println来做输出,而应该用日志来做输出。
System.out.println 在输出的时候,每打印一行都是需要进行IO的,所以会很耗性能。

如果你在调试时用了大量的System.out.println来做输出,到了项目上线时必须要删除这些输出语法,否则会因为IO造成性能影响。

但如果你用的日志(debug)来输出,项目上线时,只要将应用级别调高,这些日志输出就会被自动关闭,因此无需输出这些日志输出语句。


▲  互联网上常问如何控制日志输出

  Spring Boot让MyBatis输出它执行的SQL语句啊?非常简单:

   logging.level.<Mapper组件所在包>=debug
   组件可以理解是类

  Spring Boot看到Redis的详细执行过程?非常简单:
   logging.level.io.lettuce.core=debug

   Spring Boot整合Redis默认使用Lettuce依赖,而io.lettuce.core就是Lettuce组件核心API所在的包。

  Spring Boot看到MongoDB的详细执行过程?非常简单:
   logging.level.com.mongodb=debug

  上面com.mongodb就是MongoDB核心API所在的包。

  由此可见,通过Spring Boot可以让它输出任意框架的执行过程,只需要如下设置

  logging.leve.<框架核心API所在的包>=debug

代码示例:

1、先创建一个类,获取日志对象。
2、然后在application.yml配置类里面配置一些日志信息—改变Spring Boot的核心日志级别

通过debug=true或trace=true等属性(通过配置文件、命令行参数、系统变量、OS环境变量等方式)改变整个Spring Boot核心的日志级别。

如图:这里在配置文件里面设置核心日志级别为 trace = true,就是级别为 trace。
但是打印出来的还是只有 info、warn 和error,但是控制台的启动记录里面还是有trace的,如图

springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

这个是改变项目程序组件的核心日志级别,设置特定包下所有类的日志级别,打印的时候就可以如图,把 trace 和 debug 都打印出来

这个是让controller包下面的所有类的日志级别设置为 trace
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端
这个是让LogController这个类的日志级别设置为 trace
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

★ 日志输出到文件:

Spring Boot默认只将日志输出到控制台,不输出到文件,如果要将日志输出到文件,

可为Spring Boot设置如下两个属性的其中之一:

- logging.file.name:设置日志文件的文件名。

- logging.file.path:设置日志文件的目录。使用默认的spring.log作为文件名。

logging.file.path 这个有一个好处,就是当日志文件过大的时候,就会自动把日志文件分成多个文件。

代码示例:

- logging.file.path:设置日志文件的目录。使用默认的spring.log作为文件名。

springboot日志配置slf4j,Spring Boot,spring boot,logback,后端
这个就是生成在文件夹中的日志文件,跟控制台的打印出来的是一样的。
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

Logback设置

logging.logback.rollingpolicy.file-name-pattern: 设置对日志归档的文件名模板
logging.logback.rollingpolicy.clean-history-on-start:设置应用启动时是否清除日志归档
logging.logback.rollingpolicy.max-file-size日志文件归档之前的最大大小
logging.logback.rollingpolicy.total-size-cap:日志归档在被删除之前所能容纳的最大大小
logging.logback.rollingpolicy.max-history: 保留多少天的日志归档(默认为7)

Java 的日志归档是指对生成的日志文件进行周期性或大小限制的管理,以便保留和存档旧的日志文件,以便后续的检查、分析和备份。
通常情况下,应用程序会生成大量的日志数据,这些日志文件会越来越大,占用系统存储空间。为了避免过多的日志文件影响系统性能和存储空间的占用,可以对日志进行归档管理。
具体来说,归档通常有以下几种方式:
基于时间的归档:按照一定的时间间隔(如每天、每周、每月)将日志文件进行归档,将旧的日志文件存档到特定的文件夹或压缩文件中,以便后续查阅。
基于大小的归档:当日志文件达到一定大小时,将当前的日志文件存档,然后重新创建一个新的日志文件,以确保日志文件的大小始终在一个可接受的范围内。

★ 日志组:

(1)将多个包定义一个组名,

(2)然后对整个组设置指定的日志级别

——这样即可将该组对应的所有包统一设置成相同的日志级别。

 日志组也是一个提高项目可维护性的小技巧。

就是一个项目有很多个包(文件夹),比如 controller,service、dao、domain、config 等等,然后我们想让controller、service、dao这三个包的日志级别设置为 debug 级别。但是又不可能在配置文件中一个包一个包的写配置,所以这个时候就可以用到日志组。

代码示例:

需求:我这个项目有三个包c1,c2,c3,我想让 c2 和 c3 这两个包的日志级别为 warn ,然后项目的其他包的日志级别为trace。

这里建3个包
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

我配置让 c2 c3这两个包的日志级别为warn
项目其他包的日志级别为 trace,其他包不可能一个一个写出来,所以直接把最大的包 boot 进行设置。
但是 c2 c3 这两个包又被包含在 boot 包里面,所以要看看c2 c3 这两个包的日志级别是我们要的 warn 级别,还是会因为被boot包 包含而变成trace级别
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

如图可以看出 c2 c3 这两个包的日志级别没有被 boot 包影响,还是我们要的warn级别。
而项目的其他包,如 c1 ,就是我们要的 trace 级别
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

这两个设置,谁放上面谁放下面都没有影响各自的日志级别,不会有那种放下面然后覆盖上面的情况。
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

上面的日志实现就是基于 SLF4J + Logback:SLF4J是门面,Logback是实现

▲ 门面类(抽象层):SLF4J、JCL(Apache commons logging)、JBoss Logging
▲ 日志实现:Log4j、Log4j2、Logback、JUL(JDK内置的java.util.logging)

★ 如何替换默认的日志实现(Logback)

▲  两步:

(1)去掉Logback依赖库,添加新日志实现的依赖库。
    Logback日志实现的优先级最高,当该日志实现的JAR存在时,Spring Boot总会使用该JAR包作为默认的日志实现。       

(2)在类加载路径的根路径下为新日志实现提供对应的配置文件。

     默认从类加载路径的根路径下加载日志配置文件,也可通过logging.config属性来设置新的加载路径。

     除了可根据底层依赖库自动选择日志实现外——根据JAR包来自动选择日志实现,找到哪个日志实现的JAR包,Spring Boot就是用哪个日志实现。

     还可通过org.springframework.boot.logging.LoggingSystem属性显式指定日志实现,
该属性的值可以是LoggingSystem实现类的全限定名。


▲  不同日志实现的配置文件:

Logback:logback-spring.xml、logback-spring.groovy、logback.xml或 logback.groovy

Log4j2: log4j2-spring.xml或log4j2.xml

JDK(JUL):logging.properties

Spring Boot 推荐 使用带-spring后缀的配置文件作为对应日志框架的配置文件。

★ 控制日志只输出到文件(不输出到控制台)

项目上线时比较实用!


 两步:

(1)控制日志输出到文件。
     指定logging.file.name或logging.file.path两个属性的其中之一。

(2)还需要显式提供日志实现对应的配置文件,通过该配置文件关闭日志在控制台的输出。

     ——这一步的配置文件往往应该是日志实现相关的,和Spring Boot关系并不大。

代码示例

1、创建一个 logback-spring.xml 配置文件,这个配置文件专门用来控制 logback 日志的,现在在这个配置文件进行配置,让日志不要输出到控制台,只输出到指定的文件就行
application.yml 的配置不需要改,还是那样。

springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

启动项目,然后再访问方法,发现控制台都没有任何的日志输出,一片空白,然后打开日志输出的文件,发现成功只输出在文件中
如图:项目的启动时间是16:36分,文件中的日志也是同个时间,证明日志只输出在指定文件中,没有输出在控制台
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

logback-spring.xml配置文件

<!--  关闭LogBack的日志在控制器的输出  -->
<configuration>
    <!--  导入Logback通用的日志配置  -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!--  定义日志文件  -->
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <!--  导入输入到文件的日志配置  -->
    <include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
    <!--  指定将日志输出到文件 ,只输出到文件,不输出到控制台 -->
    <root level="INFO">
        <appender-ref ref="FILE"/>
    </root>
</configuration>

上面用的是默认的 Logback,现在要改成 log4j2

★ 通过例子示范使用log4j2替换Logback

 ——比较小众的应用场景。用的比较少,因为 springboot 推荐用 SLF4J+Logback ,所以没必要改成其他的
 但是这里可以尝试一下。

(1)去掉去掉Logback依赖库,添加Log4j2日志实现的依赖库。

(2)添加log4j2日志的配置文件——这一步是可选的。

代码示例

在创建项目的时候,就会默认有logback的日志依赖了,所以把这个logback的日志依赖从pom.xml文件中去除就可以了。

1、这个操作就是把springboot默认的日志排除在外(就是把logback排除在外)

2、添加新的日志实现

springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

启动项目,发现日志输出和之前没有什么区别,因为更改日志实现,是底层实现的,不是具体的代码实现,可以理解为抽象的,所以用 logback 或者是 log4j2 ,只是底层实现方法变了,但是呈现出来的效果还是一样的。

如果:因为把logback 改成 log4j2 ,所以原本设置的 日志记录只输出到文件,不输出到控制台的作用,也失效了。

springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

要看logback 和 log4j2 的区别,只能从maven 里面看了
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

改回来 logback ,原本设置的 日志记录只输出到文件,不输出到控制台的效果 就又恢复了
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端

另一种日志打印方式:

在类上面添加注解 @Slf4j,那么就会有一个 log 对象,直接用 log.info 来打印日志就可以了。


@SpringBootApplication
@Slf4j
public class App {

    public static void main(String[] args) {
        var ctx = SpringApplication.run(App.class, args);
        //普通控制台打印
        System.err.println("普通打印myConfig01:"+ctx.getBean("myConfig01"));
        //@Slf4j 日志打印,输出info级别的日志,日志只能输出字符串
        //直接拿配置类这个bean,类名要小写
        log.info("日志打印myConfig01:"+ctx.getBean("myConfig01"));

        log.info("日志打印dataFormat:"+ctx.getBean("getDataFormat"));

    }

普通控制台打印和日志打印效果
springboot日志配置slf4j,Spring Boot,spring boot,logback,后端文章来源地址https://www.toymoban.com/news/detail-772982.html

到了这里,关于23、springboot日志使用入门-- SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习SpringBoot使用slf4j日志并输出到文件中

    再使用前,先了解一下介绍,否则你也不会用! 1、日志级别 SLF4J将日志分为trace、debug、info、warn、error五个级别,每个级别对应记录不同的日志,对应不同的使用场景。 日志级别从低到高分为 TRACE DEBUG INFO WARN ERROR FATAL 如果设置为 WARN ,则低于 WARN 的信息都不会输出 一般设

    2024年02月06日
    浏览(43)
  • 【SpringBoot中使用SLE4J日志框架启动报错:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinde】

    1.1 出现的问题 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 1.2 原因分析 检查自己的maven依赖,发现已经引入了slf4j-api了,这是为什么呢?其原因是,SLF4J本身

    2024年02月13日
    浏览(35)
  • SpringBoot集成slf4j日志系统

    作者平台: | CSDN:blog.csdn.net/qq_4115394… | 掘金:juejin.cn/user/651387… | 知乎:www.zhihu.com/people/1024… | GitHub:github.com/JiangXia-10… | 微信公众号:1024笔记 本文大约4777字,预计阅读时长11分钟 日志系统作为一个应用系统的重要部分之一,它能够有助于我们在系统在线上环境中如果

    2023年04月19日
    浏览(39)
  • 【Java】异常处理 之 使用SLF4J 和 Logback

    前面介绍了 Commons Logging 和 Log4j 这一对好基友,它们一个负责充当日志 API,一个负责实现日志底层,搭配使用非常便于开发。 有的童鞋可能还听说过 SLF4J 和 Logback 。这两个东东看上去也像日志,它们又是啥? 其实 SLF4J 类似 于Commons Logging ,也是一个日志接口,而 Logback 类似

    2024年02月12日
    浏览(50)
  • 日志框架梳理(Log4j,Reload4j,JUL,JCL,SLF4J,Logback,Log4j2)

    文中代码示例获取:关注【 Qin的学习营地 】,回复【 日志框架梳理 】 在了解日志框架时总会列出一系列框架:Log4j,Reload4j,JUL,JCL,SLF4J,Logback,Log4j2,这么多框架让人感到混乱,该怎么选取、该怎么用。接下来,让我们逐步理清这些框架及之间的关系。 首先来了解日志

    2024年02月05日
    浏览(54)
  • SLF4J日志框架在项目中使用

    SLF4J全称“Simple Logging Facade for Java”,作为各种日志框架的简单门面。例如: java.util.logging、logback 、 reload4j等。只需要切换日志框架的jar包依赖就可以切换日志框架。 SLF4J支持的日志框架包含如下: log4j:常用的日志框架,需要有配置文件log4j.properties logback:可以通过logba

    2024年02月02日
    浏览(39)
  • java slf4j,Commons Logging与log4j,Logback,tinylog和异常配合使用

    1、日志是什么?         日志是每天记录我们程序情况的。日志管理的目的是为了记录日志。 2、为什么会有日志?         1、问题追溯,通过日志文件的记录可以使我们运维或者程序员快速查找问题根源。         2、状态检测,检测我们系统状况,为项目出现的问题做

    2024年02月16日
    浏览(57)
  • 微服务学习系列15:日志框架slf4j使用和原理

    目录   前言 一、slf4j 项目Github地址: slfj4j桥接API slf4j 项目模块描述 二、slf4j-api 简单使用 代码分析  三、基础知识 外观模式 适配器模式 什么是桥接模式 什么是SPI 什么是API 四、设计分析 参考 slf4j主要是为了给Java日志访问提供一个标准、规范的API框架,其主要意义在于提

    2024年02月07日
    浏览(36)
  • 应用中日志的优雅使用(整合log4j2与SLF4J)

    应用中不可直接使用日志系统( Log4j、 Logback) 中的 API,而应依赖使用日志框架( SLF4J、 JCL–Jakarta Commons Logging) 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 日志框架( SLF4J、 JCL–Jakarta Commons Logging)的使用方式(推荐使用 SLF4J) 所有

    2023年04月09日
    浏览(39)
  • JAVA中使用log4j及slf4j进行日志输出的方法

    JAVA中输出日志比较常用的是log4j,这里讲下log4j的配置和使用方法,以及slf4j的使用方法。 一、下载log4j的架包,并导入项目中,如下: 二、创建log4j.properties配置文件 1、log4j配置文件的位置: (1)如果是java project项目,则在项目的根目录下创建log4j.properties而不是在src目录下

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包