SpringBoot整合Logback日志框架配置全解析

2023-10-29

一、Logback日志框架介绍

SpringBoot使用 Commons Logging 进行所有内部日志的记录,但默认配置也提供了对常用日志的支持,如 Java Util Logging,Log4J2,和Logback. 每种logger都可以通过配置使用控制台或文件输出日志内容。

Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。

二、SpringBoot与Logback

假设你使用starter启动创建SpringBoot应用,则默认已经导入了spring-boot-starter-logging的依赖,相继也就导入了logback所需要的依赖。

1、默认日志格式

于是,当我们启动SpringBoot应用时,控制台将会显示INFO级别的日志输出。

可以看到,输出内容如下:

  • 日期和时间,精确到毫秒级别。

  • 日志级别:INFO,【日志级别默认从高到低:ERROR,WARN,INFO,DEBUG,TRACE】。

  • 进程ID

  • 分隔符:来标识实际日志消息的开始。

  • 线程名:用方括号括起来(在控制台输出时可能被截断)。

  • 日志记录器名称:这通常是源类名称(通常缩写)。

  • 日志信息

logback是没有FATAL级别的,它对应的就是ERROR。

2、控制台输出

默认的日志配置就是将日志信息显示到控制台,默认情况下,将会显示INFO级别以上的日志信息。你还可以通过使用--debug标志启动debug模式。

$ java -jar myapp.jar --debug

使用IDEA操作可以编辑Program arguments:--debug。

在application.properties中配置debug=true同样也可以将日志级别调整到DEBUG。

3、文件输出

默认情况下,SpringBoot的日志只会输出到控制台,如果你还想输出到文件中,你需要配置logging.file.namelogging.file.path两个属性。

下面这个表格展示如何组合使用logging.*来达到理想的效果:

logging.file.name logging.file.path Example Description
(none) (none) 只会输出到控制台
指定文件 (none) my.log 写入指定的日志文件在当前项目目录下
(none) 指定目录 log 在当前项目下的log目录,写入spring.log文件

日志文件达到10 MB时会触发滚动策略【切分】,默认情况下会记录INFO以上级别的信息。 可以使用logging.file.max-size属性更改大小限制。 除非已设置logging.file.max-history属性,否则默认情况下将保留最近7天的轮转日志文件。 可以使用logging.file.total-size-cap限制日志归档文件的总大小。 当日志归档的总大小超过该阈值时,将删除备份。 要在应用程序启动时强制清除日志存档,请使用logging.file.clean-history-on-start属性。

4、日志级别

可以使用logging.level设置所有受支持的日志记录器的级别。

logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error

5、日志组

使用logging.group能够将相关的logger组合在一起统一管理日志级别等配置。使用方法如下:

假设定义了group为tomcat:

logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat

一旦这样定义之后,就可以仅仅通过一行配置,完成相关三个logger的级别配置:

logging.level.tomcat=TRACE

SpringBoot预定义了两个开箱即用的日志组:

Name Loggers
web org.springframework.core.codecorg.springframework.httporg.springframework.weborg.springframework.boot.actuate.endpoint.weborg.springframework.boot.web.servlet.ServletContextInitializerBeans
sql org.springframework.jdbc.coreorg.hibernate.SQLorg.jooq.tools.LoggerListener

# pre-defined
logging.level.web=debug
logging.level.sql=debug

6、自定义log配置

由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。

你可以根据你的日志系统,按照下面表格的定义规则,选择定义对应的日志配置:

Logging System Customization
Logback logback-spring.xmllogback-spring.groovylogback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

SpringBoot官方推荐使用带有-spring的文件名作为配置,如logback-spring.xml而不是logback.xml

这样命名的好处在于:因为标准的logback.xml配置文件加载得太早,所以不能在其中使用扩展,需要使用logback-spring.xml

当然上面是默认的命名规则,如果你想自定义xml的名称,自定义路径,可以通过logging.config属性配置:logging.config=classpath:logging-config.xml

三、logback-spring.xml自定义注意事项

接下来分享一份配置十分详细的logback.xml配置,参照注释,应该就能够掌握xml的定义。

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds" debug="false">
    <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
    <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
    <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
    <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="log" />
    <property name="console_log_pattern"
              value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
    <property name="charset" value="UTF-8"/>
    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 -->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>DEBUG</level>
         </filter>
        <encoder>
            <pattern>${console_log_pattern}</pattern>
        </encoder>
    </appender>

    <!--输出到文件,只记录INFO级别信息-->
    <appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/roll_info/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>${console_log_pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 如果超过10MB就删除 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>10MB</maxFileSize>
        </triggeringPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--输出到文件,只记录WARN级别信息-->
    <appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    </appender>
    <!--输出到文件,只记录ERROR级别信息-->
    <appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    </appender>

    <!--
    root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG
    可以包含零个或多个appender元素。
    -->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="info_file" />
        <appender-ref ref="warn_file"/>
        <appender-ref ref="error_file"/>
    </root>

    <!--
        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
        <logger>仅有一个name属性,
        一个可选的level和一个可选的additivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
              如果未设置此属性,那么当前logger将会继承上级的级别。
        additivity:是否向上级logger传递打印信息,默认是true
    -->
    <!-- 使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
         第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
         第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别:
    -->
    <logger name="com.hyh.logback.web.LogTestController" level="WARN" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="warn_file"/>
        <appender-ref ref="error_file"/>
    </logger>

    <!--    如果多环境开发可以用springProfile -->
    <!--开发环境:打印控制台-->
    <springProfile name="dev">
        <!--可以输出项目中的debug日志,包括mybatis的sql日志-->
        <logger name="com.hyh.logback.web" level="DEBUG">
            <appender-ref ref="console"/>
        </logger>
        <!--
            root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
            level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG
            可以包含零个或多个appender元素。
        -->
        <root level="INFO">
            <appender-ref ref="console"/>
        </root>
    </springProfile>
</configuration>

最终的效果,会在项目路径下生成日志文件:/log/info/log-info-2020-11-01.0.log,并且日志文件的策略也在xml中定义。

控制台打印信息,如下图所示:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot整合Logback日志框架配置全解析 的相关文章

随机推荐

  • SpringBoot使用log

    目录 简介 实现步骤 1 在 pom xml 文件中添加 lombak 依赖 2 配置 application properties 日志设置 3 在要使用日志的类上直接添加 Slf4j 注解 然后就可以直接使用 log xxx 方法记录日
  • ABAP对excel的操作(为单元格设置公式)

    文章目录 前言 一 效果 二 代码 前言 给单元格设置公式 一 效果 运行程序 执行 excel效果 二 代码 代码如下 示例 Report ZDEMO EXCEL6
  • 编程职业的乐趣

    编程职业的乐趣 美酒的酿造需要年头 美食的烹饪需要时间 片刻等待 更多美味 更多享受 Good cooking takes time If you are made to wait it s to serve you better and
  • C语言 创建简单结构体输入学生基本信息

    结构体 include
  • VM虚拟机怎么安装mac os?(全教程)

    网络上教程很多 大多数是缺这缺那的 基本上不完整的 我试了很多次看了好多文档才安装成功 现在把我安装成功的过程写下来让更多的人知道如何在windows虚拟机上安装苹果的Mac os 让大家避免走不需要走的路 保姆级教程 此方法我在三台不同配
  • 使用支持向量机进行航线预测————附Matlab代码

    使用支持向量机进行航线预测 附Matlab代码 随着交通运输的发展 航空公司需要提高飞行的效率和安全性 而飞行航线的规划是保证飞行效率和安全性的关键因素之一 因此 利用机器学习算法来预测航线 成为了一个热门的话题 其中 支持向量机 Supp
  • 绕过圆括号过滤实现XSS弹框

    用data协议
  • 思科实验9.网络层:PPP协议配置

    PPP协议配置 基础知识 常用命令 实验流程 目的 1 设计拓扑 2 配置主机IP地址 3 配置路由器 4 设置PPP协议 5 验证主机连通 基础知识 PPP协议即点对点协议 是在点对点连接上传输多协议数据包提供了一个标准方法 是一种点到点
  • 算法进阶指南:0x18:双栈排序

    Tom 最近在研究一个有趣的排序问题 通过 2 个栈 S1 和 S2 Tom 希望借助以下 4 种操作实现将输入序列升序排序 操作 a 如果输入序列不为空 将第一个元素压入栈 S1 操作 b 如果栈 S1 不为空 将 S1 栈顶元素弹出至输
  • uboot下内存操作mw和md命令详解

    mw简介 u boot 中的 mw 命令是用于向内存写入数据的命令 它有4种形式 mw b 写入 1 个字节 8 比特 的数据 mw w 写入 1 个字 2 字节 16 比特 的数据 mw l 写入 1 个长字 4 字节 32 比特 的数据
  • Redis 学习笔记2:redis.conf配置文件详解

    Redis 的配置文件位于 Redis 安装目录下 文件名为 redis conf 参数说明 参数说明 redis conf 配置项说明如下 1 Redis默认不是以守护进程的方式运行 可以通过该配置项修改 使用yes启用守护进程 daem
  • 阻抗匹配之反射波形测量

    稍微接触过高速信号的朋友 一定对阻抗匹配和信号反射都有所了解 甚至可以按照公式 把反射波形一路推导出来 但是 纸上得来终绝浅 绝知此事要躬行 今天 我们就来实测一下信号反射波形 测试环境如下 信号发生器产生一个1 25MHz VPP 2V的
  • 数据库连接池(C++11实现)

    目的 因为对数据库的操作实质上是对磁盘的IO操作 所以如果对数据库访问次数过多 就会到导致大量的磁盘IO 为了提高MySQL数据库 基于C S设计 的访问瓶颈 除了在服务器端增加缓存服务器缓存常用的数据 之外 例如Redis 还可以增加连接
  • [POJ1088] 滑雪(递归dp)

    Description Michael喜欢滑雪百这并不奇怪 因为滑雪的确很刺激 可是为了获得速度 滑的区域必须向下倾斜 而且当你滑到坡底 你不得不再次走上坡或者等待升降机来载你 Michael想知道载一个区域中最长底滑坡 区域由一个二维数组
  • yolov5 6.0运行

    1 github下载yolov5 6 0代码 下载链接 2 利用Anaconda安装所需环境参考 如何配置pytorch 3 在pycharm打开文件并选择配置好的环境编译器 4 安装所需模块 利用作者提供的requirements txt
  • linux系统编程(七)进程

    文章目录 1 进程 1 1 进程相关概念 1 1 1 程序和进程 1 1 2 并发 1 1 3 单道程序设计 1 1 4 多道程序设计 1 1 5 CPU和MMU 1 1 6 进程控制块PCB 1 1 7 进程状态 1 2 环境变量 1 2
  • opencv条码(4)图像的flip之图形化界面

    flip函数可以实现图像反转 这里贴出mainwindow cpp的内容吧 书上的代码对应opencv2 2现在有些不能用了请注意 include mainwindow h include ui mainwindow h using nam
  • 华为OD机试 - 最小循环子数组(Java)

    题目描述 给定一个由若干整数组成的数组nums 请检查数组是否是由某个子数组重复循环拼接而成 请输出这个最小的子数组 输入描述 第一行输入数组中元素个数n 1 n 100000 第二行输入数组的数字序列nums 以空格分割 0 nums i
  • Java架构直通车——理解Tomcat架构设计

    文章目录 引入 Socket与SeverSocket 一个简单Web容器设计与实现 理解Tomcat架构设计 什么是Servlet Tomcat Servlet容器 引入 Socket与SeverSocket Socket Socket是网
  • SpringBoot整合Logback日志框架配置全解析

    一 Logback日志框架介绍 SpringBoot使用 Commons Logging 进行所有内部日志的记录 但默认配置也提供了对常用日志的支持 如 Java Util Logging Log4J2 和Logback 每种logger都