【Java日志系列】Logback日志框架

news/2024/9/18 12:06:28/ 标签: java, logback, 开发语言, 日志框架

目录

前言

一、Logback简介

二、Logback组件

三、快速入门

四、配置文件的使用

1. 配置文件中的标签

1.1 logger标签

1.2 root标签

1.3 appender标签

1.4 filter标签

1.5 encoder标签

1.6 property标签

2. 常见的Appender

2.1 ConsoleAppender

2.2 FileAppender

2.3 RollingFileAppender

2.3.1 TimeBasedRollingPolicy

2.3.2 FixedWindowRollingPolicy

3. 异步日志

总结 


前言

  日志是软件开发中不可或缺的一部分,它不仅能够帮助开发者了解应用程序运行的状态,还能在出现问题时提供诊断信息。Logback 是一个高效、灵活的日志框架,它由 Log4j 的创始人 Ceki Gülcü 开发,并且是 SLF4J (Simple Logging Facade for Java) 的默认实现。Logback 分为三个模块:core、classic 和 access,其中 classic 模块提供了丰富的日志功能。本文将介绍 Logback 的基本概念,包括其组件结构、快速入门、配置文件的使用、常见的 Appender 以及如何配置异步日志记录等功能。

一、Logback简介

  Logback是由Log4j创始人设计的又一个开源日志组件,当前分为三个模块:logback-core、logback-classic和logback-access,其中logback-core是其他两个模块的基础模块。logback-classic是log4j的一个改良版本,此外logbac-classic完整实现SLF4J API,使你开以很方便地更换成其他日志系统如log4j或JDK14 Loggin。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

二、Logback组件

Logger:日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。

Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。

Layout:负责把事件转换为字符串,格式化的日志信息的输出。在Logback中Layout对象封装在encoder中,也就是说我们配置文件中使用的encoder其实就是Layout。

三、快速入门

  首先,我们导入slf4j日志门面和logback的日志实现依赖:

<!-- slf4j依赖 -->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.13</version>
</dependency>
<!-- logback日志实现  logback-classic已经涵盖logback-core这个依赖了 -->
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.5.6</version>
</dependency>

  编写如下入门代码:

java">@Test
public void testQuick() {Logger logger = LoggerFactory.getLogger(LogbackTest.class);logger.error("error信息");logger.warn("warn信息");logger.info("info信息");logger.debug("debug信息");logger.trace("trace信息");
}

  运行结果如下图所示:

补充:logback有5种日志输出级别。分别是trace < debug < info < warn < error,其中debug是默认的日志级别。

四、配置文件的使用

  Logback提供了logback.groovy、logback-test.xml和logback.xml这三种配置文件(如果都不存在则采用默认的配置)。一般来说,我们会使用logback.xml来作为配置文件。Logback配置文件一般在springboot项目的src/main/resources目录下创建名为logback-spring.xml的文件。

1. 配置文件中的标签

1.1 logger标签

  logger是日志记录器,用来控制要输出哪些日志记录语句,对日志信息进行级别限制。有level属性、name属性、additivity属性,其中name属性必须要写,指定到哪一个类或者哪一个包,additivity表示是否向上一层传递打印信息,默认为true。可以包含 appender-ref 元素。下面是使用示例:

<configuration><logger level="ERROR" name="com.example.testlog.LogTest" additivity="false"><appender-ref ref="STDOUT"></appender-ref></logger>
</configuration>

1.2 root标签

  root标签指定最基础的的日志输出级别,它只有一个level属性,可以包含 appender-ref 元素。
level属性可以选择,ALL、TRACE、DEBUG、INFO、WARN、ERROR、NULL、OFF、INHERITED,下面是使用示例:

<configuration><root level="debug"><appender-ref ref="STDOUT"></appender-ref></root>
</configuration>

1.3 appender标签

  appender就是附加器,日志记录器会将输出的任务交给附加器完成,不同的附加器会将日志输出到不同的地方,例如控制台、文件、网络等。下面是使用示例:

<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern></encoder></appender>
</configuration>

补充(常见的附加器)

控制台附加器:ch.qos.logback.core.ConsoleAppender。
文件附加器:ch.qos.logback.core.FileAppender。
滚动文件附加器:ch.qos.logback.core.rolling.RollingFileAppender,属性有name、class,class用来指定附加器,name来表示当前附件器的名字。其他需要指定附件器的标签,可以通过appender-ref标签中的ref来指定。可以包含encoder元素、fileter元素等。

1.4 filter标签

  filter是过滤器,过滤器是附件器的一个组件,它是用于判断附件器是否输出日志的。一个附件器可以包含多个过滤器。过滤器只能有三个值,DENY、NEUTRAL、ACCEPT。DENY是不输出日志,NEUTRAL是不决定是否输出日志,ACCEPT是输出日志。

  在filter中 ,可以有三个元素,level元素、onMatch元素和onMismatch元素。其中,<level>用于设置过滤级别,<onMatch>用于配置符合过滤条件的操作,<onMismatch>用于配置不符合过滤条件的操作。下面是使用示例:

<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><filter><level>info</level><onMatch>DENY</onMatch><onMismatch>ACCEPT</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern></encoder></appender>
</configuration>

1.5 encoder标签

  encoder最主要的就是pattern标签,用于控制输出日志的格式,常见的一些日志的输出格式如下面所示:

  • %-10level 日志级别 案例为设置10个字符,左对齐
  • %d {yyyy-MM-dd HH:mm:ss.SSS} 日期
  • %c 当前类全限定名
  • %M 当前执行日志的方法
  • %L 行号
  • %thread 线程名称
  • %m 或者%msg 信息
  • %n 换行
  • %logger 输出日志的类名
  • %logger{length} 对输出日志的类名缩写展示

  下面是一个encoder标签及输出格式的使用示例:

<encoder><pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>

1.6 property标签

  property标签用来定义变量, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值,下面是一个使用示例:

<property name="HOME" value="../log"><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><file>${HOME}/log.log</file>
</appender>

2. 常见的Appender

2.1 ConsoleAppender

  把日志添加到控制台,有以下子节点:

  • <encoder>:对日志进行格式化。
  • <target>:字符串 System.out 或者 System.err ,默认 System.out 。
<configuration>  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  <encoder>  <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>  </encoder>  </appender>  <root level="DEBUG">  <appender-ref ref="STDOUT" />  </root>  
</configuration>  

2.2 FileAppender

  把日志添加到文件,有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • <encoder>:对记录事件进行格式化。
  • <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是false。
<configuration>  <appender name="FILE" class="ch.qos.logback.core.FileAppender">  <file>testFile.log</file>  <append>true</append>  <encoder>  <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>  </encoder>  </appender>  <root level="DEBUG">  <appender-ref ref="FILE" />  </root>  
</configuration>  

补充:除了将文件以.log的文本形式输出外,我们还可以将文件输出成html文件,相关配置如下图所示:

2.3 RollingFileAppender

  滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • <encoder>:对记录事件进行格式化。
  • <rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
  • <triggeringPolicy>: 告知 RollingFileAppender 何时激活滚动。
  • <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制:不支持也不允许文件压缩;不能设置file属性,必须留空。

  其中,对于滚动策略RollingPolicy,可以有以下两个策略:

2.3.1 TimeBasedRollingPolicy

TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动。有以下子节点:

  • <fileNamePattern>:必要节点,包含文件名及“%d”转换符, “%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender 的file子节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
  • <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
2.3.2 FixedWindowRollingPolicy

  FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。有以下子节点:

  • <minIndex>:窗口索引最小值
  • <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
  • <fileNamePattern >:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip

  下面是一个简单的示例,表示每天生成一个日志文件,保存30天的日志文件。

<configuration>   <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">   <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>   <maxHistory>30</maxHistory>    </rollingPolicy>   <encoder>   <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>   </encoder>   </appender>    <root level="DEBUG">   <appender-ref ref="FILE" />   </root>   
</configuration>  

3. 异步日志

  所谓异步日志,系统会为日志操作单独分配出来一个线程,原来用来执行当前方法的主线程会继续向下执行,两个线程争夺CPU的使用权,在实际项目开发中,越大的项目对于日志的记录就越庞大,为了保证项目的执行效率,异步日志是一个很好的选择。下图是异步日志的一个使用示例:

总结 

  在本文中,我们介绍了 Logback 的基本概念和使用方法。从 Logback 的架构开始,我们了解到它分为 core、classic 和 access 三个模块,以及它与 SLF4J 的关系。接着通过快速入门的例子,展示了如何在项目中引入 Logback 并进行日志记录。随后,我们详细探讨了 Logback 的配置文件,包括常用的标签和属性,以及如何配置不同的 Appender 实现不同的日志输出需求。最后,我们还介绍了如何利用异步日志来提高程序性能。无论是简单的需求还是复杂的应用场景,Logback 都能提供强大的支持。随着对日志需求的增长和技术的发展,Logback 仍然是一个值得信赖的选择。


http://www.ppmy.cn/news/1516360.html

相关文章

C# SignalR 实时通信:构建动态交互的秘诀

标题&#xff1a;C# SignalR 实时通信&#xff1a;构建动态交互的秘诀 摘要 SignalR 是 ASP.NET Core 的一个库&#xff0c;它简化了在应用程序中添加实时通信的过程。无论是聊天应用、实时游戏还是协作工具&#xff0c;SignalR 都能提供高效且易于实现的解决方案。本文将深入…

Windows—UDP编程

Client骨架&#xff1a; #include <iostream> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib")int main() {//启动Winsock DLLWORD wVersionRequested MAKEWORD(2, 2);WSADATA lpWSAData;WSAStartup(wVersionRequested, &lpWSAData);//…

dbeaver数据库工具配置连接openGauss5.0

在DBeaver数据库工具中配置连接openGauss 5.0&#xff0c;可以通过以下步骤进行&#xff1a; 一、准备工作 下载openGauss JDBC驱动&#xff1a; 访问openGauss的官方网站&#xff08;如https://opengauss.org/zh/&#xff09;&#xff0c;下载适用于您操作系统的JDBC驱动。对…

浪潮服务器NVME 硬盘通过 Intel VROC 做RAID

INTEL VROC Configuration solution 1.VMD configuration in BIOS Processor > IIO Configuration> Intel(R) VDM Technology> Intel(R) VMD for volume Management Device on Socket 0 “CPU 0”, Intel VMD for volume management device for “PStack0” or “PSta…

C# 匿名函数 delegate(参数...){ }

什么是匿名函数 顾名思义&#xff0c;就是没有名字的函数 匿名函数的使用主要是配合委托和事件进行使用 脱离委托和事件 是不会使用匿名函数的 基本语法 delegate (参数列表) { 函数逻辑 …

【jvm】PC寄存器为什么设定为线程私有?

目录 1. 说明2. 多线程执行的需求3. CPU切换线程的需要4. 并发执行的特性 1. 说明 1.PC寄存器被设定为线程私有主要是为了满足多线程执行的需求、CPU切换线程的需要以及并发执行的特性。2.这种设计保证了每个线程都能独立地执行其任务&#xff0c;并且能够在CPU进行线程切换时…

【Spring Boot】全局异常处理

目录 背景 前言 设计步骤 1.定义异常信息类&#xff1a; 2.自定义异常&#xff1a; 3.创建全局异常处理类 4.在控制器中抛出异常 5.输出 捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中&#xff0c;如何处理全局异常的&#xff0c;也就是如何捕获全局异…

如何合理设置PostgreSQL的`max_connections`参数

合理设置PostgreSQL的max_connections参数对于数据库的稳定性和性能至关重要。这个设置值决定了允许同时连接到数据库的最大客户端数量。如果设置不当&#xff0c;可能导致资源浪费或系统过载。以下是设置max_connections时需要考虑的几个关键因素&#xff1a; 1. 评估系统硬件…

【python】灰色预测 GM(1,1) 模型

文章目录 前言python代码 前言 用 python 复刻上一篇博客的 Matlab 代码。 【学习笔记】灰色预测 GM(1,1) 模型 —— Matlab python代码 # %% import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt from matplotlib.pylab import mplmpl.rcPa…

pikachu SSRF通关(服务器端请求伪造)

开始闯关吧 一共有两关 第1关 SSRF(curl) 按照指示点击下图蓝色字体的链接 得到了下图地址栏里的带参数的url&#xff0c;参数名是url&#xff0c; PHP的curl PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。 libcurl目前…

趣味算法------试用 6 和 9 组成的最大数字

目录 ​编辑 题目描述 解题思路 具体代码 总结 题目描述 给你一个仅由数字 6 和 9 组成的正整数 num。 你最多只能翻转一位数字&#xff0c;将 6 变成 9&#xff0c;或者把 9 变成 6 。 请返回你可以得到的最大数字。 输入格式 一个整数 输出格式 一个整数 输入输出…

java日常管理

JRE、JDK和JVM简述 GC 什么是GC GC&#xff08;Garbage Collection&#xff09;内存自动管理极速&#xff1a;内存垃圾自动回收技术[内存的分配和释放] 使用GC的好处 提高了软件开发的抽象度&#xff1b;程序员可以将精力集中在实际的问题上而不用分心来管理内存的问题&am…

Linux数据相关第1个服务_备份服务rsync

1、备份服务概述 备份服务&#xff1a;需要使用到脚本&#xff0c;打包备份&#xff0c;定时任务 备份服务&#xff1a;rsyncd 服务&#xff0c;不同主机之间数据传输 特点: rsync是个服务也是命令使用方便&#xff0c;具有多种模式传输数据的时候是增量传输 增量与全量&am…

周报 | 24.8.19-24.8.25文章汇总

为了更好地整理文章和发表接下来的文章&#xff0c;以后每周都汇总一份周报。 周报 | 24.8.12-24.8.18文章汇总-CSDN博客 新智元 | 微调Flux席卷全网&#xff0c;外国小哥一人组一队漫威英雄&#xff01;_flux 怎么微调-CSDN博客 新智元 | 百万在线&#xff0c;大圣归来&…

[ 全部搞定 - 发票导出表格 ] PDF发票提取到表,图片发票提取到表格,扫描件发票提取到表格,全电发票PDF,全电发票扫描件识别导出EXCEL表格

最近很多朋友说找PDF发票提取Excel表格的&#xff0c;找到了图片识别Excel表格的&#xff0c;有的找图片识别Excel表格的&#xff0c;找到了PDF发票提取表格的&#xff0c;所以就很难搞&#xff0c;还有的说都想要 今天一篇文章&#xff0c;全部搞定所有发票【电子发票&#x…

Solon2 接口开发:实战 Gateway 模式效果

在软件开发中&#xff0c;特别是使用 Solon 框架进行接口开发时&#xff0c;采用 Gateway 模式可以有效地管理 API 路由、认证、限流等。Solon 是一个轻量级的 Java 微服务框架&#xff0c;它支持多种开发模式&#xff0c;包括 Web、RESTful API、Socket 等。这里&#xff0c;我…

一文了解 Vue3 的 nextTick 大致信息

nextTick 是 Vue 3 中用于完成数据绑定和 DOM 更新后执行的方法&#xff0c;非常有用&#xff0c;也是 Vue 的一道比较常见的面试题。 1. 基本用法 nextTick 是一个异步方法&#xff0c;它允许我们在下一个 DOM 更新后执行回调函数。当更改了响应式数据并需要在更新后的 DOM …

3、Unity【基础】Resources资源场景动态加载

文章目录 一、Resources资源动态加载1、Unity中特殊文件夹1、工程路径获取2、Resources资源文件夹3、StreamingAssets流动资源文件夹4、persistentDataPath持久数据文件夹5、Plugins插件文件夹6、Editor编辑器文件夹7、默认资源文件夹StandardAssets 2、Resources同步加载1、Re…

uniapp中 使用 VUE3 组合式API 怎么接收上一个页面传递的参数

项目是uniapp &#xff0c;使用了vue3 vite // 使用的组合式API 的 语法糖 <script setup> // 无法使用 onLoad <script> 使用不了下面方法获得上一个页面参数传递 onLoad(options){ } 解决方案1&#xff08;亲测Ok&#xff09;&#xff1a;消息通知与监听…

用于不平衡分类的 Bagging 和随机森林

用于不平衡分类的 Bagging 和随机森林 Bagging 是一种集成算法&#xff0c;它在训练数据集的不同子集上拟合多个模型&#xff0c;然后结合所有模型的预测。 [随机森林]是 bagging 的扩展&#xff0c;它也会随机选择每个数据样本中使用的特征子集。bagging 和随机森林都已被证…