当前位置: 首页 > news >正文

Springboot--整合Logback 日志框架(Maven)

文章目录

  • 前言
  • 一、Logback 日志框架介绍:
  • 二、整合:
    • 2.1 引入jar
    • 2.2 logback.xml 文件配置:
    • 2.3 日志输出:
      • 2.3.1 方式一:
      • 2.3.2 方式二:
    • 2.3 日志输出结果展示:
  • 三、扩展:
    • 3.1 日志输出格式设置:
    • 3.2 日志输出过滤器设置:
  • 总结


前言

在项目调试和运行中,都可能涉及到 日志的输出,本文对springboot 整合Logback 日志框架进行介绍。


一、Logback 日志框架介绍:

Logback 是一个灵活的日志框架,旨在替代传统的 Apache Log4j 框架。它是由 Ceki Gülcü 开发,并且支持 SLF4J 日志接口。Logback 由三个主要模块组成:

  1. Logback Core:Logback 的核心模块,提供了日志事件处理和过滤的基本功能。Logger、Appender、Layout 和 Filter 等关键组件都在这个模块中定义。

  2. Logback Classic:Logback 经典模块,是 Log4j 的改进版本,兼容 Log4j 的 API 和配置文件。Logback Classic 扩展了 Logback Core 模块,提供了更多功能和灵活性。

  3. Logback Access:Logback 访问模块,用于记录 HTTP 请求的访问日志。它可以与 Servlet 容器集成,用于记录 Web 应用程序的访问日志。

Logback 的一些主要特点包括:

  • 性能优秀:Logback 的设计旨在提供高性能的日志记录功能,比传统的 Log4j 框架更快速地处理日志事件。

  • 灵活性:Logback 提供了丰富的配置选项和插件支持,使得用户可以根据需要定制日志记录的行为和格式。

  • SLF4J 兼容:Logback 与 SLF4J(Simple Logging Facade for Java)结合使用,使得应用程序可以灵活地切换不同的日志框架。

  • 支持文件和控制台日志输出:Logback 支持将日志输出到文件、控制台以及其他各种目标,可以根据需求配置输出目的地。

  • 多种过滤器:Logback 提供了多种过滤器选项,可以根据不同的条件过滤日志事件,使得日志输出更加精准。

总之,Logback 是一个功能丰富、灵活性强、性能优秀的日志框架,适用于大多数 Java 应用程序的日志记录需求。可以根据具体的项目需求和喜好选择是否在的应用程序中使用 Logback 框架。

logback 官网;

二、整合:

2.1 引入jar

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

maven 版本参考:https://mvnrepository.com/artifact/ch.qos.logback/logback-classic

2.2 logback.xml 文件配置:

logback.xml 是 Logback 日志框架的配置文件,用于指定 Logback 日志系统的行为和属性。通过 logback.xml 文件,可以配置日志输出的格式、目标(比如控制台、文件)、日志级别、滚动策略等。

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- 日志存放路径  logs/job 设置为相对项目目录--><property name="log.path" value="logs/job" /><!-- 日志输出格式 时间 线程 日志级别 类 方法 对应的行数 输出信息 这样设置后输出格式如下 --><!-- 15:09:27.204 [http-nio-8080-exec-10] DEBUG c.e.s.l.TestLog - [getVersion,26] - debug详细信息 --><property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /><!-- 控制台输出 appender  --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- 日志内容输出格式设置为定义好的 log.pattern--><pattern>${log.pattern}</pattern></encoder></appender><!-- 系统日志输出 appender  class 中的log.pattern 表示日志滚动输出 --><appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志首次输出的文件地址  --><file>${log.path}/info.log</file><!-- 滚动输出策略:基于时间创建日志文件 ,这样第二天输出的日志,就会按照 fileNamePattern 新建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><!-- 日志内容输出格式设置为定义好的 log.pattern--><pattern>${log.pattern}</pattern></encoder><!-- 日志内容输出过滤器 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>INFO</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/debug.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/debug.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>DEBUG</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/error.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>ERROR</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- 系统模块日志级别控制 name 设置为你自己的项目根路径 如com.example.logback--><!-- level 设置日志输出的级别为debug 这样系统在进行日志输出时 只要级别在 debug  之后都可以打印 --><!-- 日志输出级别 trace< debug < info< warn < error  --><logger name="com.example.logback" level="debug" /><!-- Spring日志级别控制--><logger name="org.springframework" level="warn" /><!--系统操作日志 root 根路径的日志级别 info --><root level="info"><!-- 将定义好的几个日志输出 追加到 root 上 --><!-- console 控制台输出  --><appender-ref ref="console" /><!-- console info级别输出  --><appender-ref ref="file_info" /><!-- console debug级输出  --><appender-ref ref="file_debug" /><!-- console error级输出  --><appender-ref ref="file_error" /></root>
</configuration>

2.3 日志输出:

2.3.1 方式一:

类中定义logger 静态量

 static  Logger logger = LoggerFactory.getLogger(TestLog.class);

logger 日志输出:

logger.trace("trace追踪信息");
logger.debug("debug详细信息");
logger.info("info关键信息");
logger.warn("warn警告信息");
logger.error("error错误信息");

2.3.2 方式二:

maven 引入 lombok

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

在类上增加 @Slf4j 注解:

lombok 中 Slf4j 注解源码内容

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.TYPE})
public @interface Slf4j {String topic() default "";
}

logger 日志输出:

 log.trace("trace追踪信息");
log.debug("debug详细信息");
log.info("info关键信息");
log.warn("warn警告信息");
log.error("error错误信息");

2.3 日志输出结果展示:

控制台输出:
在这里插入图片描述

log 日志文件输出:
在这里插入图片描述

日志内容:
在这里插入图片描述

三、扩展:

3.1 日志输出格式设置:

<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20}- [%method,%line] - %msg%n" />

在这里插入图片描述

3.2 日志输出过滤器设置:

过滤器写在 Appender 标签内,可以配置一个或多个,按照先后顺序执行。过滤器会对每个级别的日志设置枚举值,表示对日志的处理方式:

在这里插入图片描述

<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 TRACE,DEBUG ,INFO,WARN,ERROR --><level>INFO</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch>
</filter>

在这里插入图片描述


总结

本文对springboot 整合Logback 日志框架进行介绍。

相关文章:

Springboot--整合Logback 日志框架(Maven)

文章目录 前言一、Logback 日志框架介绍&#xff1a;二、整合&#xff1a;2.1 引入jar2.2 logback.xml 文件配置&#xff1a;2.3 日志输出&#xff1a;2.3.1 方式一&#xff1a;2.3.2 方式二&#xff1a; 2.3 日志输出结果展示&#xff1a; 三、扩展&#xff1a;3.1 日志输出格…...

【考研数学】李林《880》vs 李永乐《660》完美使用搭配

没有说谁一定好&#xff0c;只有适不适合自身情况&#xff0c;针对自身弱点选择性价比才最高。 两者侧重点不同&#xff0c;660适合强化前期&#xff0c;弥补基础的不足&#xff0c;880适合强化后期&#xff0c;题型全面&#xff0c;提高我们对综合运用知识的能力。 选择习题…...

Java面试之消息中间件

消息队列 优缺点 特点 解耦异步削峰缺点 系统可用性降低 兜底:代码中try、catch 异常捕捉后直接进行数据库操作,或者 搭建高可用集群,Kafka集群、RocketMQ集群提高复杂度 消息重复(消费端的幂等性设计)、消息丢失(主要集中RabbitMQ)、消息的顺序(业务:1,下单 2,支付 3,发…...

网工学习 DHCP配置-接口模式

网工学习 DHCP配置-接口模式 学习DHCP总是看到&#xff0c;接口模式、全局模式、中继模式。理解起来也不困难&#xff0c;但是自己动手操作起来全是问号。跟着老师视频配置啥问题没有&#xff0c;自己组建网络环境配置就是不通&#xff0c;悲催。今天总结一下我学习接口模式的…...

【GO】语言特点 | Go和Java的对比

while循环 go语言中没有while循环&#xff0c;一般都是用for循环替代 while (条件) {} // Java的for循环for true {} // go 语言中会用一个为真的表达式作为是否 会进入循环的条件&#xff0c;也就是把其他语言的for和while合并了for循环 for (Type item : list) {} // j…...

USB2.0设备检测过程信号分析

1.简介 USB设备接入的Hub端口负责检测USB2.0设备是否存在和确定USB2.0设备的速度。检测设备是否存在和确定设备速度涉及一系列的信号交互&#xff0c;下面将分析该过程。 2.硬件 USB低速设备和全速/高速设备的连接器在硬件结构上有所不同&#xff0c;而主机或者Hub接收端连接…...

Go语言物联网开发安科瑞ADW300/4G电能表数据上传mqtt平台-电表接线到传输数据完整流程

电能表功能说明 ADW300是方便用户进行用电监测、集抄和管理&#xff0c;可灵活安装在配电箱中&#xff0c;可用于电力运维、环保监管等在线监测类平台中。我们本案例是用于工业售电公司对出售电的管理&#xff0c;设备可以监控用电情况、故障监控及警报&#xff0c;售电公司可…...

LabVIEW质谱仪开发与升级

LabVIEW质谱仪开发与升级 随着科技的发展和实验要求的提高&#xff0c;传统基于VB的质谱仪系统已经无法满足当前的高精度和高效率需求。这些系统通常存在着功能不全和操作复杂的问题&#xff0c;影响了科研和生产的进度。为了解决这些问题&#xff0c;开发了一套基于LabVIEW开…...

SwiftUI之DragGesture

SwiftUI中的DragGesture是一种手势识别器&#xff0c;用于捕捉用户拖拽操作。通过DragGesture&#xff0c;我们可以监听用户在视图上的拖拽行为&#xff0c;并对其进行响应。 在SwiftUI中&#xff0c;我们可以将DragGesture应用于任何视图&#xff0c;以便捕捉拖拽手势。在Dra…...

主网NFT的发布合约

1.什么是nft? NFT:Non-fungible-token 非同质化货币 2.新建suimove项目 使用sui move new 项目名命令新建sui move项目 sui move new nft_qyx项目结构如下: 3.写nft合约 module qyx123::nft{use sui::object::{Self, UID};use sui::transfer;use sui::tx_context::{Sel…...

分享2024年在家轻松兼职赚钱的5个副业

今天在网上看到这么一句话&#xff0c;真的让我深有感触&#xff1a;“职场人一定要有居安思危的意识&#xff0c;创业的人一定要三思而后行”。在这个瞬息万变的时代&#xff0c;连被视为铁饭碗的公务员、教师等体制内工作都不能保证一辈子的稳定。发展副业&#xff0c;似乎成…...

电脑小问题:Windows更新后黑屏

Windows 更新后黑屏解决方法 在 Windows 更新后&#xff0c;伴随了一个小问题&#xff0c;电脑启动后出现了桌面黑屏。原因可能是火绒把 explorer.exe 当病毒处理了。 下面讲解 Windows 更新后黑屏的解决方法&#xff0c;步骤如下&#xff1a; 1. 按 ctrl alt delete 组合键…...

C++指针(四)万字图文详解!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09; 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…...

商品管理系统设计100问?

你的系统是用于哪种类型的商品管理&#xff1f;比如电子商品、实体商品、服装、食品等等&#xff1f;你需要管理哪些商品信息&#xff1f;比如名称、描述、价格、库存等等&#xff1f;你是否需要对商品进行分类&#xff1f;如果是&#xff0c;分类的结构是怎样的&#xff1f;你…...

Python的反射

通过字符串的形式操作对象的属性 class Person(object):def __init__(self,name,age) -> None:self.namenameself.ageagedef walking(self):print("walking......")获取对象的属性 pPerson("Recardo",12) # 获取队形的name属性 agetattr(p,"nam…...

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…...

UE5.1_Varest_Warning

UE5.1_Varest_Warning LogVaRest: Warning: UVaRestRequestJSON::GetResponseContentAsString(637): Response content string is cached LogVaRest: Warning: UVaRestRequestJSON::GetResponseContentAsString(637): Response content string is cached是警告也是报错&#…...

硬盘温度过高会怎么办?机箱温度多少算正常?

硬盘温度 硬盘在使用过程中&#xff0c;断电很容易导致数据丢失&#xff0c;但如果温度过高&#xff0c;也可能对硬盘造成损坏。 硬盘的温度是决定电脑能否正常使用的重要因素。 如果长时间读取和存储数据&#xff0c;硬盘的温度会升高。 那么&#xff0c;硬盘的正常温度是多少…...

fs模块_写入文件

fs&#xff1a;file system&#xff08;文件系统&#xff09; fs 模块可以实现与硬盘的交互例如文件的创建、删除、重命名、移动&#xff0c;还有文件内容的写入、读取&#xff0c;以及文件夹的相关操作 // 需求&#xff1a; // 新建一个文件&#xff0c;座右铭.txt&#xff…...

flutter无法在windows平台上拖拽文件到它的窗口中

我碰到的问题是调试模式下没办法拖拽。 即便使用了第三方包desktop_drop和cross_file&#xff0c;还是这样。 但是一旦构建之后就能正常运行了。 推测是在构建的过程中&#xff0c;flutter往windows包裹代码中加了东西。 跟AI对话之后&#xff0c;推测一个可能的解决方法是修改…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

深入解析 ReentrantLock:原理、公平锁与非公平锁的较量

ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...