spring boot配置logback日志

2023-11-05

spring boot配置logback日志


第一次用 markdown编辑,哈哈

  在上一篇spring boot入门里提过,Spring Boot默认的日志打印是logback,所以配置logback日志会很简单,但是也有注意的地方。

本次配置日志的需求

  1. 日志需要控制台打印和文件打印两种。
  2. 其中文件打印按照日志级别分别保存到各自的文件里。
  3. 文件日志每天一个日志,并且保存30天。
  4. 文件日志可以自由指定保存路径、打印格式等。
  5. 控制台打印可指定打印格式,并且自由增加删除某些日志。

  通过上一篇的介绍,知道,Spring boot默认日志为logback,所以只要引入如下依赖,就会自动引入logback日志的jar包。

<!-- Spring Boot Web 依赖 -->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

  单独spring 项目使用 logback日志需要的jar包如下:

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.9</version>
</dependency>

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.9</version>
</dependency>
<!--因logback日志需要与slf4j配合使用,如下的jar包需要引入-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>

  再说一遍,spring boot项目不需要引入上边的三个jar包,已经自动引入了。

以下是配置步骤:

  • logback日志的在spring boot里的配置需要在src/main/resources下,application.properties同级,放一个logback的xml文件,一般起名字为logback-spring.xml,网上很多人建议起名字为这个,我没看出有什么区别,所以我就按照他们讲的配置了,以免出现不必要的错误。

  • logback-spring.xml按照我的需求配置成控制台打印和文件打印,直接将以下内容复制,并命名成该名字,放到上边说的位置中,具体的内容如下:

<?xml version="1.0" encoding="UTF-8"?>  
<configuration scan="true" scanPeriod="60 seconds">  
    <!-- 都说spring boot使用日志需要引入这个,但是我引入了之后总是打印两份日志,所以我去除了,并不影响使用 -->
    <!-- <include resource="org/springframework/boot/logging/logback/base.xml"/> -->
    <!-- 控制台设置 -->  
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>  
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>  
        </encoder>  
    </appender>  
    <!-- INFO -->  
    <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <!-- 文件路径 ,注意LOG_PATH是默认值,
            它的配置对应application.properties里的logging.path值-->  
        <file>${LOG_PATH}/info/info.log</file>  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
            <!-- 文件名称 -->  
            <fileNamePattern>info/info-%d{yyyy-MM-dd}.log  
            </fileNamePattern>  
            <!-- 文件最大保存历史数量 -->  
            <MaxHistory>30</MaxHistory>  
        </rollingPolicy>  
        <encoder>  
            <pattern>${FILE_LOG_PATTERN}</pattern>  
        </encoder>  
        <filter class="ch.qos.logback.classic.filter.LevelFilter">  
            <level>INFO</level>  
            <onMatch>ACCEPT</onMatch>    
            <onMismatch>DENY</onMismatch>    
        </filter>  
    </appender>

    <!-- DEBUG -->  
    <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <!-- 文件路径 ,注意LOG_PATH是默认值,
            它的配置对应application.properties里的logging.path值-->  
        <file>${LOG_PATH}/debug/debug.log</file>  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
            <!-- 文件名称 -->  
            <fileNamePattern>debug/debug-%d{yyyy-MM-dd}.log</fileNamePattern>  
            <!-- 文件最大保存历史数量 -->  
            <MaxHistory>30</MaxHistory>  
        </rollingPolicy>  
        <encoder>  
            <pattern>${FILE_LOG_PATTERN}</pattern>  
        </encoder>  
        <filter class="ch.qos.logback.classic.filter.LevelFilter">  
            <level>DEBUG</level>  
            <onMatch>ACCEPT</onMatch>    
            <onMismatch>DENY</onMismatch>    
        </filter>  
    </appender> 
     <!-- WARN -->  
    <appender name="warnAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <!-- 文件路径 ,注意LOG_PATH是默认值,
            它的配置对应application.properties里的logging.path值-->   
        <file>${LOG_PATH}/warn/warn.log</file>  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
            <!-- 文件名称 -->  
            <fileNamePattern>warn/warn-%d{yyyy-MM-dd}.log  
            </fileNamePattern>  
            <!-- 文件最大保存历史数量 -->  
            <MaxHistory>30</MaxHistory>  
        </rollingPolicy>  
        <encoder>  
            <pattern>${FILE_LOG_PATTERN}</pattern>  
        </encoder>  
        <filter class="ch.qos.logback.classic.filter.LevelFilter">  
            <level>WARN</level>  
            <onMatch>ACCEPT</onMatch>    
            <onMismatch>DENY</onMismatch>    
        </filter>  
    </appender> 

    <!-- ERROR -->  
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <!-- 文件路径 ,注意LOG_PATH是默认值,
            它的配置对应application.properties里的logging.path值-->  
        <file>${LOG_PATH}/error/error.log</file>  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
            <!-- 文件名称 -->  
            <fileNamePattern>error/error-%d{yyyy-MM-dd}.log  
            </fileNamePattern>  
            <!-- 文件最大保存历史数量 -->  
            <MaxHistory>30</MaxHistory>  
        </rollingPolicy>  
        <encoder>  
            <pattern>${FILE_LOG_PATTERN}</pattern>  
        </encoder>  
        <filter class="ch.qos.logback.classic.filter.LevelFilter">  
            <level>ERROR</level>  
            <onMatch>ACCEPT</onMatch>    
            <onMismatch>DENY</onMismatch>    
        </filter>  
    </appender>
      <logger name="org.springframework" additivity="false">
        <level value="ERROR" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="errorAppender" />
    </logger>

    <!-- 由于启动的时候,以下两个包下打印debug级别日志很多 ,所以调到ERROR-->
    <logger name="org.apache.tomcat.util" additivity="false">
        <level value="ERROR"/>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="errorAppender"/>
    </logger>

    <!-- 默认spring boot导入hibernate很多的依赖包,启动的时候,会有hibernate相关的内容,直接去除 -->
    <logger name="org.hibernate.validator" additivity="false">
        <level value="ERROR"/>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="errorAppender"/>
    </logger>
    <root level="DEBUG">
         <appender-ref ref="STDOUT"/>  
         <appender-ref ref="infoAppender"/>
         <appender-ref ref="debugAppender"/>
          <appender-ref ref="warnAppender"/>
         <appender-ref ref="errorAppender"/>
    </root> 
</configuration>  

-   其中,你们应该注意到里边有很多的“${}”形式的变量这其实是logback日志的默认名称,比如${LOG_PATH},${CONSOLE_LOG_PATTERN},${FILE_LOG_PATTERN} 等,这些变量只需要在spring boot的默认配置文件,application.properties里添加如下配置即可:

1)以下是日志输出的位置,注意在logback-spring.xml里用LOG_PATH才能获取到值

logging.path=d:/logs/springBoot

2)以下是指向日志配置文件的位置

logging.config=classpath:logback-spring.xml

3)以下是控制台打印日志格式设置,注意在logback-spring.xml里用CONSOLE_LOG_PATTERN才能获取

logging.pattern.console=[%d{yyyy-MM-dd HH:mm:ss}] -- [%-5p]: [%c] -- %m%n

4)以下是文件打印日志格式设置,注意在logback-spring.xml里用FILE_LOG_PATTERN才能获取到

logging.pattern.file=[%d{yyyy-MM-dd HH:mm:ss}] -- [%-5p]: [%c] -- %m%n

  添加上边四个配置就对日志配置完了。多说一句,为什么在application.properties文件里的日志配置名字和${} 里不同呢,这就需要看logback-spring.xml里最上边的base.xml引入,找到这个文件就明白了。它的位置在以下jar包里:

spring-boot-1.5.1.RELEASE.jar

找到如下位置:

org.springframework.boot.logging.logback

  就会看到里边有base.xml、console-appender.xml等等四个xml文件,打开file.appender.xml如下:

注意图中红色标注

  也就是说spring boot里的日志配置文件已经将其写死,但是在application.properties里又要按照其要求写,所以我感觉这也是spring boot的缺点,太多隐藏的配置了,如果知道,那很简单了,但是不知道,就会浪费很多的时间,多配置很多的无用东西。

  通过这四个spring boot的日志xml文件,也应该知道为什么在上一篇入门spring boot里没有配置日志,却打印日志的原因,其内在自己的日志应该就是这个。

  另外说一下日志的打印控制,比如有一些打印日志我不想要,就可以通过配置logback-spring.xml文件,添加一个logger标签即可。比如如下:

[2017-06-05 19:14:23] -- [INFO ]: [org.I0Itec.zkclient.ZkClient] -- zookeeper state changed (SyncConnected)
[2017-06-05 19:14:23] -- [DEBUG]: [org.I0Itec.zkclient.ZkClient] -- Leaving process event
[2017-06-05 19:14:23] -- [DEBUG]: [org.I0Itec.zkclient.ZkClient] -- State is SyncConnected

  以上三条日志我现在不需要让它打印了,那就需要额外配置了,因为它们来自于org.I0Itec.zkclient.ZkClient 类,并且打印的内容分别是DEBUG和INFO级别,日志打印只要将该类的日志打印级别调高(日志从低到高为 TRACE、DEBUG、INFO、WARN、ERROR),因此只要将该类的日志级别配置为WARN以上,就不会打印上边的内容了。配置方法如下:

 <logger name="org.I0Itec.zkclient.ZkClient" additivity="false">
        <level value="ERROR" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="errorAppender" />
</logger>

其中:

- name表示日志的打印位置,从上边可以看出是来自该类
- additivity设置为false表示该日志打印设置(控制台打印还是文件打印等具体设置)不会向根root标签传递,也就是说该logger里怎么设置的那就会怎么打印,跟root无关
- level value=’error’表示将该类日志级别设置为error级才会打印。
- 最后两行表示error级时会打印控制台和error文件同时打印日志。

配置logback日志的注意点

  1. logback和log4j最好不要放在一起,会冲突,最主要的jar包是slf4j-log4j12.jarlogback-classic.jar 这两个jar包的设计简直是反人类,有一个类,这两个都会有,只要这两个jar包同时引入,就会看到启动spring boot会有一串冲突的红字,因此,只要用logback日志,就需要特别注意除了排除log4j主要jar包,别忘了排除slf4j-log4j12.jar ,具体的排除方法,可以选择maven项目的pom.xml,在右边找到Dependency Hierarchy,然后找到要排除的jar包,右击选择Exclude Maven Artifact,然后保存即可。

  2. logback的logback-spring.xml文件如果你没有按照我这么写,在application.properties文件里就不需要配置全部的4行内容,如果直接复制的我的,那就需要配置上了。

  3. logback貌似没有log4j常用,很多的第三方jar包都使用的log4j,比如aliba的dubbo和zookeeper都是默认的log4j,所以你在引入第三方的jar时,又使用的是logback,就特别注意是不是它们默认使用的log4j,如果是的话,有slf4j-log4j12.jar 就排除即可。后边说spring boot+dubbo时会再说。

    下一篇,会说下spring boot+mybatis的配置。

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

spring boot配置logback日志 的相关文章

随机推荐

  • idea 快捷键

    注 有些操作的快捷键做了更改 和IntelliJ Idea默认的快捷键不一样 动作 快捷键 说明 Move Caret to Code Block End Ctrl 诸如 围起来的代码块 使用该快捷键可以快速跳转至代码块的结尾处 Move
  • Qt线程与界面

    看了个开源库Stacer 里面使用到了QConcrrent 这个使用很方便 这里简单记录一下总结下Qt的线程创建方法 Qt线程创建方法 QThread继承 QObject moveToThread QConcurrent run Qt中提到
  • pthread_mutex_t

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 互斥锁创建 有两种方法创建互斥锁 静态方式和动态方式 POSIX定义了一个宏PTHREAD MUTEX INITIALIZER来静态初始化互斥锁 方法如下 pthrea
  • Mybatis使用注解方式配置

    目录 1 介绍 2 初始化工程 2 1 导包 2 2 导配置 3 使用注解增删改查 3 1 环境准备 3 1 1 建库建表 3 1 2 创建Student实体类 3 1 3 创建StudentDao接口 3 1 4 配置映射关系 3 2 查
  • Python Matplotlib 实用小技巧!

    转自 网络 今天给大家介绍Matplotlib绘图实用的小技巧 1 添加标题 title matplotlib pyplot 对象中有个 title 可以设置表格的标题 import numpy as np import matplotli
  • django前端模板循环多个list

    这一部分主要涉及到后台View的设计 前端HTML页面的设计 后台设计View from django views generic import View class ForTrView View def get self request
  • PCL 区域生长分割(C++详细过程版)

    区域生长 一 概述 二 代码实现 三 结果展示 1 原始点云 2 聚类结果 四 相关链接 一 概述 区域生长分割是PCL里经典的点云聚类分割算法 具体算法原理和实现代码见 PCL 区域生长分割 为充分了解算法实现的每一个细节和有待改进的地方
  • display:none元素不可见,可通过JS方法把它修改为可见

    页面元素无论用什么xpath都无法定位 by id class name都试过了 可以去页面看看是否这个元素的display是none display none方法是设置元素不可见 所以解决办法就是首先通过JS方法把它修改为可见 js do
  • Kafka 创建 两个topic 一个用于发送信息 一个用于接收Flink处理之后的信息

    Kafka 创建 两个topic 一个用于发送信息 一个用于接收Flink处理之后的信息 Kafka生产者Java代码 package cn oneseek import cn oneseek util JsonData import or
  • 网络工程专业毕设题目选题大全

    文章目录 0 简介 1 如何选题 2 最新网络工程选题 2 1 Java web SSM 系统 2 2 大数据方向 2 3 人工智能方向 2 4 其他方向 4 最后 0 简介 学长搜集分享最新的网络工程专业毕设毕设选题 难度适中 适合作为毕
  • vue入门教程之-属性、事件和双向绑定

    vue入门教程之 属性 事件和双向绑定 欢迎关注博主公众号 java大师 专注于分享Java领域干货文章 关注回复 资源 免费领取全网最热的Java架构师学习PDF 转载请注明出处 https www javaman cn vue vue
  • 【JAVA

    package learn import java awt import javax swing import java awt event public class PinBall private Frame frame new Fram
  • 中国金融牌照全解读

    前言 金融牌照 即金融机构经营许可证 是批准金融机构开展业务的正式文件 目前金融许可证由银监会 证监会和保监会等部门分别颁发 金融监管根据时段划分为事前监管 事中监管 事后监管 市场准入制度是事前监管的核心 金融许可证则是市场准入制度的常态
  • ITERM2 自动登录跳板机脚本(多跳、带动态TOKEN)

    代码如下 设置方式是 iterm2 preference Profiles 新建一个profile 并设置Name为a Command为 Users XXX Desktop a sh 在sen text as start内传入4个参数 US
  • Android开发——菜单(Menu)-——选项菜单(OptionMenu)

    Menu 在Android3 0以前的menu显示 是用户点击手机下方操作按钮的菜单按钮时 会从界面底部向上弹出菜单 菜单内容出现在屏幕底部 可以包含六个及以上的菜单项 超出的部分则以 更多 来显示 在Android3 0以后的更高版本的系
  • git clone使用方法

    步骤是转载的该文章 后面有添加自己的要注意的地方 不完全一样 仅码住自用 使用Git clone项目 1 首先我们要确保我们的电脑上已经安装Git 桌面点击右键出现如下图所示的两个Git即Git已经安装 2 在电脑的任意一个磁盘里新建一个本
  • ARM公司发展史

    目录 1 前言 2 ARM公司发展史 3 ARM架构发展史 3 1ARMv1架构 3 2 ARMv2架构 3 3 ARMv3架构 3 4 ARMv4架构 3 5 ARMv5架构 3 6 ARMv6架构 3 7 ARMv7架构 3 8 ARM
  • 关于存储器按字节寻址和按字寻址的理解

    关于存储器按字节寻址和按字寻址的理解 近日在学习MOOC上学习哈工大刘宏伟老师的 计算机系统组成原理 课程 在4 1节提到主存的时候简单地提到一下关于按字节寻址和按字寻址的寻址空间问题 个人非常疑惑于是各处搜索查找资料 下面是本人就这个问题
  • 【机器学习】左逆、右逆、伪逆和广义逆的概念理解

    逆矩阵 对于矩阵 A A A 如果存在一个矩阵 B B B 使得 A B B
  • spring boot配置logback日志

    spring boot配置logback日志 第一次用 markdown编辑 哈哈 在上一篇spring boot入门里提过 Spring Boot默认的日志打印是logback 所以配置logback日志会很简单 但是也有注意的地方 本次