【Spring】SpringBoot 配置 logback 日志

news2024/12/26 12:55:09

1. 概述

日志在一个业务系统重非常重要,包含有非常重要的数据,可以用于客户反馈问题的排查、线上问题的追踪,以及根据日志数据对业务情况进行有效的监控配置,及时发现线上问题。

常用的日志框架有好几种,但最常用的是 logback、log4j 等。本文主要讲解 logback 日志框架的配置,后面再介绍 log4j 日志框架的配置。

 

2. 案例与解析

定义日志文件 logback.xml

<configuration>
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} {%thread} %-5level %logger{36} -%msg%n"/>
    <property name="FILE_PATH" value="logs/logback.%d{yyyy-MM-dd}.%i.log"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--按照上面配置的LOG_PATTERN来打印日志-->
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--按上面配置的 FILE_PATTERN 路径来存储日志-->
            <fileNamePattern>${FILE_PATH}</fileNamePattern>
            <!--日志保存15天-->
            <maxHistory>15</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--单个日志文件的最大,超过则新建日志文件存储-->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <encoder>
            <!--按照上面配置的 LOG_PATTERN 来打印日志-->
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!--定义日志输出级别-->
    <logger name="cn.edu.demo" level="WARN"/>
    <logger name="cn.edu.demo.controller" level="INFO"/>
    <logger name="cn.edu.demo.config" level="INFO"/>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

 

在 SpringBoot 项目的配置文件中配置

在 SoringBoot 的 application.properties (或者ymal格式的application.yml) 配置使用 logback

# logback
logging.config=classpath:logback.xml

 

配置项解析

property

定义了两个变量 LOG_PATTERNFILE_PATH,分别表示日志信息应该以什么格式输出,和日志文件输出的位置以及日志文件的命名规则;

1) LOG_PATTERN

"%d{yyyy-MM-dd HH:mm:ss} {%thread} %-5level %logger{36} -%msg%n"
  • 定义了一个格式,命名为 “LOG_PATTERN”
  • %date 或 %d 表示日期;
  • %thread 表示线程名;
  • %-5level 表示级别从左显示5个字符宽度;
  • %logger{36} 表示 logger 名字最长36个字符;
  • %msg 表示日志信息;
  • %n 是换行符;

 

2) FILE_PATH

"logs/logback.%d{yyyy-MM-dd}.%i.log"
  • 定义了一个格式,命名为 “FILE_PATH”,为日志的文件的存储位置和格式,在下面的 appender 中引用这个日志文件格式;
  • 如上,产生的日志文件被存储在项目的根文件夹下的 logs 目录下;
  • %d 为日期,%i 为该日期下的第几个日志文件(因为业务系统有可能产生很多的日志导致日志文件过大,当我们配置文件大于某个值时就进行滚动,那么就是在同一个日期下产生多个日志文件,那我们就需要 %i 来命名各个日志文件);
  • 示例,系统在 2022-12-12 产生的日志为形如 “logback.2022-12-12.0.log”、“logback.2022-12-12.1.log”、“logback.2022-12-12.2.log”、… 的日志文件;

 

appender

每一个appender代表了一个输出,在每个appender中的class设置对应的类即可指定日志输出的环境。例如以上的配置文件中:

  • 如果我们要在控制台输出日志,那么我们就需要将 appender 的 class 属性指定为 ch.qos.logback.core.ConsoleAppender
  • 如果我们要讲日志输出到文件中,并且要求日志文件按要求回滚,那么我们就需要将 appender 的 class 属性指定为 ch.qos.logback.core.rolling.RollingFileAppender

 

root

root 用于定义根 logger 的日志级别。logback 中的 logger 采用的是一种 “继承” 的机制,所有 class 中默认的就是采用的这个 root 中定义的日志级别,如果在 logger 中对某个包小的 class 指定了另外的日志级别才会覆盖掉这个 root 的日志级别。

<root level="INFO">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
</root>

以上的配置 root 的日志级别为 INFO,并且引用了两个 appender,表示默认情况下这两个 appender 都生效,只要继承的 logger 没有指定其他的 appender,那么默认的就是使用这两个 appender。

<!--定义日志输出级别-->
<logger name="cn.edu.demo" level="WARN"/>
<logger name="cn.edu.demo.controller" level="INFO">
    <appender-ref ref="CONSOLE"/>
</logger>
<root level="INFO">
<!--        <appender-ref ref="CONSOLE"/>-->
    <appender-ref ref="FILE"/>
</root>

例如以上的配置中,root 只指定了 “FILE” 这一个 appender,在 cn.edu.demo.controller 包继承了 root 的 logger,又新增了 “CONSOLE” 的 logger,那么在 cn.edu.demo.controller 包下的日志就会输出到 CONSOLE 和 FILE 中,而 cn.edu.demo 包下其他 class 中的 logger 只会将日志输出到 FILE 中,不会在控制台输出。

 

logger

用于覆盖 root 中指定的日志的级别.

<logger name="cn.edu.demo" level="WARN"/>
<logger name="cn.edu.demo.controller" level="INFO"/>
<logger name="cn.edu.demo.config" level="INFO"/>

以上配置中,指定了 cn.edu.demo 包下的 class 都用 WARN 级别的日志; cn.edu.demo.controllercn.edu.demo.config 包下的 class 都采用 INFO 级别的日志。而其他的 class 则用 root 中定义的日志级别

 

3. 测试

在代码中通过如下地方式获取 logger

private static final Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);

 

控制台输出的日志

 

文件输出的日志

 

参考文献

[1] https://blog.csdn.net/qq_56044050/article/details/123454820

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Node.js计算机毕业设计大学校园兼职网站Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【观察】定义下一代云原生实时数仓,SelectDB Cloud“打了个样”

2020年&#xff0c;国家在《关于构建更加完善的要素市场化配置体制机制的意见》中&#xff0c;首次将数据与土地、资本、劳动力并列为关键生产要素&#xff0c;并提出加快培育数据要素市场的愿景&#xff0c;此举可谓意义重大。背后的原因是&#xff0c;当下中国企业正在加速从…

【车载开发系列】UDS诊断---写入内存($0x3D)

【车载开发系列】UDS诊断—写入内存&#xff08;$0x3D&#xff09; UDS诊断---写入内存&#xff08;$0x3D&#xff09;【车载开发系列】UDS诊断---写入内存&#xff08;$0x3D&#xff09;一.概念定义二.报文格式1&#xff09;请求报文2&#xff09;肯定响应3&#xff09;否定响…

Redis实战——消息队列

目录 1. 什么是消息队列&#xff1f; 2. 基于List结构模拟消息队列 3. 基于PubSub的消息队列 4. 基于Stream的消息队列 4.1 基于Stream的单消费者模式 4.2 基于Stream的消息队列-消费者组 1. 什么是消息队列&#xff1f; 字面意思就是存放消息的队列。最简单的消息队列模…

学习参数化计算优化风扇定位step by step

一、写在前面 本教程的目的是演示ANSYS Icepak的参数和优化功能。假定读者已经熟悉ANSYS Icepak界面&#xff0c;但是缺乏实战经验。 在这个案例中&#xff0c;读者可以掌握&#xff1a; 1、使用Network网络热阻Block来模拟IC芯片封装模型。 2、将变量定义为参数并通过参数…

算法竞赛入门【码蹄集进阶塔335题】(MT2226-2250)

算法竞赛入门【码蹄集进阶塔335题】(MT2226-2250&#xff09; 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2226-2250&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f;目录1. MT2226 36进制22. MT2227 36进制33. MT2228 36进制44.…

电商、线上教育、在线医疗等必备资质——ICP许可证 。

危中有机&#xff0c;疫情也概莫能外。一场突如其来的疫情&#xff0c;引发了消费、健康、办公、学习等领域的新变革&#xff0c;电商、短视频、游戏、线上教育、在线医疗、知识付费等“互联网”项目&#xff0c;再次迎来发展机遇。 然而&#xff0c;如果想要借助互联网进行经…

[附源码]Python计算机毕业设计大学生网上书店Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

type 与 interface

type 与 interface 官方文档是这么说的&#xff1a; For the most part, you can choose based on personal preference, and TypeScript will tell you if it needs something to be the other kind of declaration. If you would like a heuristic, use interface until you…

基于C#+SQL Server2008实现(WinForm)学生宿舍管理系统【100010029】

1 概述 本次课程设计是数据库课程设计&#xff0c;我选的是学生宿舍管理系统&#xff0c;功能块主要是宿舍管理、学生管理、出入登记和来访登记&#xff0c;目的在于将学生宿舍的管理实现信息化&#xff0c;监控学生宿舍的情况防止意外发生。 课程设计任务的需求分析 2.1设计…

01算法的概念

开始系统学习算法啦&#xff01;为后面力扣和蓝桥杯的刷题做准备&#xff01;这个专栏将记录自己学习算法是的笔记&#xff0c;包括概念&#xff0c;算法运行过程&#xff0c;以及代码实现&#xff0c;希望能给大家带来帮助&#xff0c;感兴趣的小伙伴欢迎评论区留言或者私信博…

Day828.多线程原语:管程 -Java 并发编程实战

多线程原语&#xff1a;管程 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于多线程原语&#xff1a;管程的内容。 并发编程这个技术领域已经发展了半个世纪了&#xff0c;相关的理论和技术纷繁复杂。 那有没有一种核心技术可以很方便地解决的并发问题呢&#xff1…

JAVA毕业设计——基于SpringBoot的健身房管理系统(源代码+数据库)

github代码地址 https://github.com/ynwynw/gym-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于SpringBoot的健身房管理系统(源代码数据库) 一、系统介绍 系统层次结构图如下&#xff1a; 管理员登录模块会员管理模块教练管理模块课程管理模块器材…

基于Java+SQL Server2000实现(界面)学生选课管理系统【100010025】

学生选课管理系统 二、需求描述 本系统是一个单机版的小型的学生选课管理系统&#xff0c;在本系统中&#xff0c;开发了一个面向管理员、学生和教师这三个对象的教务平台&#xff0c;对学生提供的服务有登录、选课、、修改登录密码、和查询成绩这几个服务&#xff0c;所选课…

第二季5:配置视频捕获(step3:VI部分)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 前言 本文将详细介绍博文第二季3&#xff1a;sample_venc.c的整体分析提及的“配置视频捕获”。 该部分主要涉及以下步骤&#xff1a; 5、配置MIPI6、初始化ISP7、运行ISP线程8、配置开启VI 设备捕…

Mybatis 参数处理器注入配置解析流程

参数处理器的作用 Mybatis作为一个ORM框架&#xff0c; 其最原始的本质就是JDBC&#xff0c;对于JDBC的使用步骤中有2步和参数处理器有关&#xff0c; 就是给预处理器PreparedStatement 设置参数以及通过结果集获取字段值。 这两个步骤在Mybatis中已经成为框架底层逻辑流程&am…

【K8S系列】第十一讲:包管理神器-Helm

目录 序言 1.背景介绍 1.1 k8s 简单介绍 1.2 k8s部署挑战 2.Helm 2.1 Helm介绍 2.1 使用优势&#xff1a; 3.Helm模块 3.1 Helm 3.1.1 安装Helm 3.2 Chart 3.2.1 Chart 基本介绍 3.2.2 Chart目录结构 3.3 Repoistory 3.4 Config 3.5 Release 4.投票 序言 当…

Windows及Linux系统查找某个端口和文件被占用

概述 开发中很常见的问题&#xff0c;每次遇到这个问题&#xff0c;都是去Google搜索&#xff0c;不一定能搜到满意的答案&#xff0c;有点耗时&#xff0c;故记录一下&#xff0c;得到本文。 端口被占用&#xff0c;导致IDEA启动应用失败。又或者某个文件被某个未知的应用使…

c#入门-抽象类

抽象类 有些类存在的意义就是为了让别的类继承。自己本身不应该具有实例。例如 class 单位 {public int 生命; } class 建筑 : 单位 {public int 护甲; } class 英雄 : 单位 {public int 护盾; } class 小兵 : 单位 {public int 经验; }可以使用abstract把他声明为抽象类。 抽…

Linux查找find命令全面剖析

Linux查找find命令全面剖析 1. 文件查找 在文件系统上查找符合条件的文件 1.1 简述 locate 命令 非实时查找(数据库查找) 依赖于事先构建的索引&#xff0c;索引的构建是在系统较为空闲时自动进行(周期性任务) 手动更新数据库(updatedb)&#xff0c;索引构建过程需要遍历整…