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

Logback日志技术

Logback日志技术

日志

日志(Logging)是软件开发和运维中用于记录系统或应用程序运行期间发生的运行信息、状态变化、错误信息等的一种机制,这种记录的方式就好像我们日常生活中写日记一样。它提供了一种持久化的方式,使得开发者和运维人员可以回顾系统过去运行时发生的事情,了解系统的运行情况,诊断问题,并进行优化。

sout的局限

在Java程序运行时,我们可以通过标准输出:System.out.println对程序运行过程进行监视,通过sout将程序运行过程输出在控制台中,方便观察和调试sout输出也可以达到类似于“记录日志”的效果,并且通过sout输出十分简单、方便,但也十分局限sout只能在控制台中输出,不能输出到其他地方(如本地文件或者数据库中),假如程序停止或清空控制台,就再也无法看到程序运行的过程了。并且使用sout在代码中记录日志,不便于项目的扩展和维护(假如说不需要记录日志了,那么必须去代码中sout的地方一行一行的更改),由于这些局限,所以说在实际开发中,我们一般是通过日志技术将项目运行的日志记录到本地文件中保存。

日志技术迭代

JUL

这是JavaSE平台提供的官方日志框架,配置相对简单,年代久远,不够灵活且性能较差,所以说现在已经基本上不再使用

Log4j

这是一个流行的日志框架,其提供了灵活的配置选项,支持多种输出目标(比如控制台本地文件数据库等),是一个比较强大的日志框架。

Logback

Log4j的设计者根据Log4j升级的日志框架,其提供了更多的功能和配置选项,其性能也优于Log4j,是现在最受欢迎的日志框架。本文主要讲解的是Logback框架。

Slf4j

Simple Logging Facade for Java,其翻译成中文是简单日志门面,其提供了一套日志操作的标准接口及抽象类,允许应用程序使用不同的底层日志框架。相当于可以在代码中直接使用Slf4j提供的API,但是真正干活的是底层日志框架的实现方法。

Logback快速入门

Logback使用十分简单,当使用springboot框架构建项目时,更是事半功倍。

1.首先需要引入Logback的依赖,但是当我们使用springboot框架时,该依赖已经传递,无需手动引入:

如果不是使用springboot框架构建项目,就需要引入其依赖(至少得用maven构建项目吧...):

2.配置文件logback.xml,需要使用logback.xml配置文件配置logback框架的相关设置(比如日志级别输出位置日志格式等),假如是springboot项目,就需要将这个配置文件放在resource文件夹中。

3.定义日志记录对象Logger,这一步是固定的,想要记录日志,就需要一个日志记录对象Logger,我们是通过操作Logger对象中的方法记录日志的,其定义方式是固定的:

private static final Logger log = LoggerFactory.getLogger(当前类的字节码文件) 

注意:要使用Slf4j中的Logger对象和LoggerFactory!

假如使用了Lombok,那么可以直接使用注解@Slf4j,这个注解就会自动帮助我们创建一个名为log的Logger对象。 

做好这些准备工作之后,就可以记录日志了

@SpringBootTest
class JavaWeb12LogbackApplicationTests {private static final Logger log = LoggerFactory.getLogger(JavaWeb12LogbackApplicationTests.class);@Testpublic void testLogback() {log.info("开始计算");int sum = 0;for (int i = 0; i < 100; i++) {sum += i;}log.info("计算结果为{}", sum);log.info("{}结束计算", LocalDateTime.now());}
}

观察控制台输出日志:

如图所示,说明使用Logback日志框架记录日志成功,成功在控制台中记录了日志。但是仅仅是在控制台中输出日志,这和sout并无区别,反而显得更加复杂,这个时候我们就需要在logback.xml中进行设置,设置Logback的细节了。

logback.xml配置文件

logback.xml配置文件是对日志框架输出的日志进行控制的,可以用于配置日志输出的格式位置开关日志输出等,我们先来看这样一份常见的logback.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度  %msg:日志消息,%n是换行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern></encoder></appender><!-- 系统文件输出 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--日志文件输出的文件名,%i表示序号,从0开始--><FileNamePattern>D:/log/web_study-%d{yyyy-MM-dd}-%i.log</FileNamePattern><!--最多保存的历史日志文件数量--><MaxHistory>100</MaxHistory><!--每个日志文件的最大大小,超过这个大小会自动记录到新文件,默认为10MB--><MaxFileSize>10MB</MaxFileSize></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度  %msg:日志消息,%n是换行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern></encoder></appender><!-- 日志输出级别 --><root level="info"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /></root>
</configuration>

日志输出级别

    <!-- 日志输出级别 --><root level="info"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /></root>

这段配置文件中的代码规定了日志的输出级别level="info",则意味着必须级别≥info的日志才能被输出,级别<info的日志就不会被输出了;可以根据需求,设置不同的级别appender-ref ref="STDOUT"是将日志输出到控制台,appender-ref ref="FILE"是将日志输出到系统文件。这段代码的意思可以理解为:将级别≥info的日志输出到控制台和系统文件

控制台输出

<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度  %msg:日志消息,%n是换行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern></encoder>
</appender>

这段配置文件主要是配置控制台输出,需要在appender中指定name属性为STDOUT(便于输出级别引用),class属性指定为ch.qos.logback.core.ConsoleAppender,代表这是控制台输出在encoder中设置输出格式%d表示需要输出时间,然后在{}中指定时间的格式;%thread表示需要输出是哪个线程输出该日志的;由于日志级别一般是4-5个字符,所以说使用%-5level,输出日志级别,通过指定宽度,可以让日志输出更加美观;%msg就是日志输出的消息内容;%n是换行符,这个一般来说都会加,便于日志观察。

系统文件输出

<!-- 系统文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--日志文件输出的文件名,%i表示序号,从0开始--><FileNamePattern>D:/log/web_study-%d{yyyy-MM-dd}-%i.log</FileNamePattern><!--最多保存的历史日志文件数量--><MaxHistory>100</MaxHistory><!--每个日志文件的最大大小,超过这个大小会自动记录到新文件,默认为10MB--><MaxFileSize>10MB</MaxFileSize></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度  %msg:日志消息,%n是换行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern></encoder>
</appender>

这段配置文件主要是配置系统文件输出,需要在appender中指定name属性为FILE(便于输出级别引用),class属性指定为ch.qos.logback.core.rolling.RollingFileAppender,代表这是文件输出。在rollingPolicy中设置输出系统文件的设置:FileNamePattern用于设置日志输出的文件名%d用于表示时间,和上面一样、%i序号,从0开始,日志文件的后缀名一般是.log;MaxHistory表示系统最多保存的历史日志文件数量,此处设置为100;MaxFileSize表示每个日志文件的最大大小,超过这个大小会自动记录到新文件,默认是10MBencoder中的内容和控制台输出一致,此处不做赘述。

日志级别

日志级别是指日志信息的类型,日志都会分级别,常见的日志级别如下:

trace

trace级别是日志级别中最低的级别,用于追踪、记录程序的运行轨迹,使用较少。

debug

debug级别高于trace级别,是用于记录程序调试过程信息,实际应用中将其视为最低级别(实际上最低级别是trace,但是在使用时将debug当作最低),使用较多。

info

info级别高于debug级别,用于记录一般信息,描述程序运行相关事件,比如:网络连接io操作等,使用较多。

warn

warn级别高于info级别,用于输出警告信息,记录潜在的有害情况,使用较多。

error

error级别是这几个级别中最高的级别,用于输出错误信息,使用较多。

我们在logback.xml文件中配置日志输出级别时,若不是特殊情况,不建议输出info级别以下的日志,因为很多框架在启动时,会输出大量的tracedebug级别的日志,会影响我们查看日志。

相关文章:

Logback日志技术

Logback日志技术 日志 日志&#xff08;Logging&#xff09;是软件开发和运维中用于记录系统或应用程序运行期间发生的运行信息、状态变化、错误信息等的一种机制&#xff0c;这种记录的方式就好像我们日常生活中写日记一样。它提供了一种持久化的方式&#xff0c;使得开发者…...

9分布式微服务架构

分布式微服务架构不光需要从架构上的设计优化系统&#xff0c;还要在编码上优化达到最好的效果 中心化的设计 中心化的设计比较简单&#xff0c;分布式集群中的角色分为两种&#xff0c;管理者和被管理者。 在一个分布式或者集群中&#xff0c;管理者角色管理着其他处理实际…...

Leecode刷题C语言之统计重新排列后包含另一个字符串的子字符串数目②

执行结果:通过 执行用时和内存消耗如下&#xff1a; void update(int *diff, int c, int add, int *cnt) {diff[c] add;if (add 1 && diff[c] 0) {// 表明 diff[c] 由 -1 变为 0(*cnt)--;} else if (add -1 && diff[c] -1) {// 表明 diff[c] 由 0 变为 -…...

HTML和CSS相关的问题,为什么页面加载速度慢?

页面加载速度慢是网站优化中一个常见的问题&#xff0c;可能由于多种原因&#xff0c;包括HTML和CSS的代码编写方式、资源的加载顺序、页面渲染的复杂性等。以下是一些常见的原因和优化方法&#xff0c;结合实际项目代码示例进行讲解。 1. 过多的资源请求 如果页面包含大量的…...

LiveGBS流媒体平台GB/T28181常见问题-没有收到视频流播放时候提示none rtp data receive未收到摄像头推流如何处理?

LiveGBS没有收到视频流播放时候提示none rtp data receive未收到摄像头推流如何处理&#xff1f; 1、none rtp data receive2、搭建GB28181视频直播平台 1、none rtp data receive LiveSMS 收不到下级推流 首先需要排查服务器端 UDP & TCP 30000-30249 端口是否开放其次排…...

Flask表单处理与验证

Flask是一个轻量级的Python框架&#xff0c;它通过扩展库提供了对表单处理与验证的支持。WTForms是一个流行的Flask扩展库&#xff0c;用于创建和验证Web表单。它提供了一种声明式的方法来定义表单结构和验证逻辑&#xff0c;使得表单处理更为简洁和优雅。下面&#xff0c;我们…...

正泰电工携手图扑:变电站数字孪生巡检平台

随着电力行业的快速发展与智能化转型&#xff0c;传统的人工巡检方式难以匹配现代电网对于效率、安全和精细化管理的高标准要求。在此背景下&#xff0c;构建智慧变电站巡检系统已成为推动变电站智能化进程、实现高效运营和保障电网可靠性的重要战略。 图扑软件与正泰电工联合…...

瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 视频硬件编解码-代码版

前言 在上一篇文章中&#xff0c;我们讲解了如何使用 ffmpeg-rockchip 通过命令来实现 MPP 视频硬件编解码和 RGA 硬件图形加速&#xff0c;在这篇文章&#xff0c;我将讲解如何使用 ffmpeg-rockchip 用户空间库&#xff08;代码&#xff09;实现 MPP 硬件编解码。 本文不仅适…...

uniapp 预加载分包,减少loading

在 uniapp 中&#xff0c;可以通过配置 pages.json 文件中的 preloadRule 属性来实现页面预加载功能。以下是具体操作步骤&#xff1a; 1. 在 pages.json 中配置 preloadRule preloadRule 用于指定哪些页面需要预加载&#xff0c;以及预加载时机。下面是一个示例配置&#xf…...

c#删除文件和目录到回收站

之前在c上遇到过这个问题&#xff0c;折腾许久才解决了&#xff0c;这次在c#上再次遇到这个问题&#xff0c;不过似乎容易了一些&#xff0c;亲测代码如下&#xff0c;两种删除方式都写在代码中了。 直接上完整代码&#xff1a; using Microsoft.VisualBasic.FileIO; using Sy…...

GESP2024年12月认证C++六级( 第三部分编程题(1)树上游走)

参考程序&#xff1a; #include <iostream> #include <string>using namespace std;int main() {long long n, s; // n为移动次数&#xff0c;s为初始节点编号string moves; // 移动指令串// 输入处理cin >> n >> s;cin >> moves;long long…...

Redis数据结构服务器

Redis数据结构服务器 什么是Redis数据结构服务器 的概念和特点 是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存中的数据结构存储服务器&#xff0c;可用作数据库、缓存和消息中间件。它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09…...

【向量数据库 Milvus】centos8源码安装和部署 Milvus 2.5.3

在龙晰操作系统&#xff08;LoongArch 架构&#xff09;的 CentOS 8 环境中通过源码安装和部署 Milvus 2.5.3 可能会面临一些挑战&#xff0c;因为 Milvus 的官方支持主要集中在 x86 和 ARM 架构上。以下是一个详细的安装步骤&#xff0c;但需要注意&#xff0c;某些依赖项可能…...

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQLData Query Languag…...

C++实现设计模式---原型模式 (Prototype)

原型模式 (Prototype) 原型模式 是一种创建型设计模式&#xff0c;它通过复制现有对象来创建新对象&#xff0c;而不是通过实例化。 意图 使用原型实例指定要创建的对象类型&#xff0c;并通过复制该原型来生成新对象。提供一种高效创建对象的方式&#xff0c;尤其是当对象的…...

鸿蒙面试 2025-01-10

写了鉴权工具&#xff0c;你在项目中申请了那些权限&#xff1f;&#xff08;常用权限&#xff09; 位置权限 &#xff1a; ohos.permission.LOCATION_IN_BACKGROUND&#xff1a;允许应用在后台访问位置信息。 ohos.permission.LOCATION&#xff1a;允许应用访问精确的位置信息…...

Linux Top 命令 load average 指标解读

前言 作为平台开发的同学&#xff0c;维护平台稳定性是我们最基本的工作职责&#xff0c;下面主要介绍下top 命令里 &#xff0c;load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载&#xff0c;它表示运…...

31_搭建Redis分片集群

Redis的主从复制模式和哨兵模式可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题、高并发写的问题。由于数据量过大,单个master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Red…...

客户案例 | Ansys与索尼半导体解决方案公司合作推进自动驾驶汽车基于场景的感知测试

该合作使OEM厂商和一级供应商能够可靠地评估和验证 ADAS/AV 功能在各种天气和照明条件下的性能 主要亮点 Ansys AVxcelerate Sensors™自动驾驶汽车&#xff08;AV&#xff09;传感器仿真软件&#xff0c;可实现面向基于场景的感知测试的实时多光谱摄像头仿真 利用AVxcelerat…...

c#-Halcon入门教程——标定

Halcon代码 read_image (NinePointCalibration, D:/Desktop/halcon/ca74d-main/九点标定/NinePointCalibration.gif)rgb1_to_gray (NinePointCalibration, GrayImage)get_image_size (GrayImage, Width, Height) dev_display (GrayImage)* 获取当前显示的窗口句柄 dev_get_win…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...