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

Springboot中如何记录好日志

Springboot中如何记录日志

日志体系整体介绍

日志一直在系统中占据这十分重要的地位,他是我们在系统发生故障时用来排查问题的利器,也是我们做操作审计的重要依据。那么如何记录好日志呢?选择什么框架来记录日志,是不是日志打越多越好,带着这些问题我们今天一起来讨论下springboot应用如何记录好日志。

在我们java工程中,日志框架一般分为两层,日志门面和日志实现。

日志门面

日志门面是一个抽象层,它定义了一组统一的日志接口给用户使用。隐藏了底层日志实现的细节,提供了一种与具体日志实现解耦的方式。常见的日志门面有SLF4J(Simple Logging Facade for Java)和Apache Commons Logging等。日志门面的作用包括:

  • 提供统一的日志接口,方便在应用程序中记录日志。
  • 实现日志级别的控制,可以在不同环境中灵活地调整日志输出级别。
  • 提供日志消息的格式化和输出控制。

日志实现

日志实现是一种具体的日志框架,常见的包括Logback、Log4j、Java Util Logging等。不同的日志实现可能提供不同的功能和性能特性。最基础的都提供了以下共功能:

  • 实现日志门面定义的接口,提供日志记录的功能,可以将日志消息输出到指定的目标,如控制台、文件、数据库等
  • 提供灵活的日志配置选项,如输出格式、目标、日志级别等

总结一下,日志门面提供了统一的接口,让应用程序使用,而日志实现则负责将日志消息输出到具体的目标。那么我们可以直接用日志实现来记录日志吗,当然是可以的,但是使用日志门面,有他的优点:

  • 日志和代码解耦,每个不同的日志实现记录日志的api是不一样的,定义的日志级别可能也有差别,那么如果我们直接使用日志实现比如log4j在代码里记录日志,就需要用到log4j的api。这样将来有一天如果需要切换到logback,则需要将所有log4j的代码替换成logback。但是使用日志门面,我们只需要切换配置文件就可以了。
  • 兼容性:使用日志门面可以兼容不同的日志实现,因为大多数日志门面都支持多种日志实现。这样可以在项目中使用不同的日志库,以满足不同的开发环境和需求。
  • 统一接口:使用日志门面提供的统一接口,有利于维护和各个类的日志处理方式统一,提高代码的可读性和可维护性。
    在这里插入图片描述

springboot如何配置Logback做日志框架

  1. \src\main\resources目录下添加logback.xml的配置文件,
  2. 配置日志的输出路径、输出格式等
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--定义日志文件的存储地址--><property name="LOG_PATH" value="/home/app/logs" /><!-- 输出到控制台 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{36}] - %msg%n</pattern></encoder></appender><!-- 配置info级别日志的输出路径,滚动策略 --><appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/info/info-%d{yyyy-MM-dd}-%i.log</fileNamePattern><maxHistory>30</maxHistory><maxFileSize>50MB</maxFileSize></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{36}] - %msg%n</pattern></encoder></appender><!-- 配置error级别日志的输出路径,滚动策略 --><appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/error/error-%d{yyyy-MM-dd}-%i.log</fileNamePattern><maxHistory>30</maxHistory><maxFileSize>50MB</maxFileSize></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{36}] - %msg%n</pattern></encoder></appender><!-- 设置日志级别 --><root level="INFO"><appender-ref ref="CONSOLE" /><appender-ref ref="INFO_FILE" /><appender-ref ref="ERROR_FILE" /></root>
</configuration>

滚动策略

rollingPolicy 用于配置日志文件的滚动策略,决定何时创建新的日志文件或对现有日志文件进行归档。常见的日志滚动策略有以下几种:

  1. TimeBasedRollingPolicy:按时间滚动日志文件。该策略会根据指定的时间模式,如日期或时间间隔,创建新的日志文件。可配置属性有:

    • fileNamePattern:指定日志文件的命名模式。可以使用日期格式和/或通配符来表示日志文件的命名规则。例如,logs/app-%d{yyyy-MM-dd}.log 表示按日期切割日志文件,并以app-2022-01-01.log的格式命名。
    • maxHistory:指定保留的历史日志文件的数量。当滚动发生时,将保留最大数量的历史日志文件,较旧的日志文件将被删除。例如,7 表示最多保留 7 个历史日志文件。
    • cleanHistoryOnStart:指定在启动时是否清除历史日志文件。为 true,即在启动时删除所有历史日志文件,只保留当前日志文件。如果设置为 false,则会保留历史日志文件,但仍按照日期规则创建新的日志文件。
    • totalSizeCap:指定所有历史日志文件的总大小上限。当滚动发生时,如果历史日志文件的总大小超过了这个上限,较旧的日志文件将被删除,以保持总大小在限制范围内。可以使用B、 KB、 MB、 GB作为单位。
  2. SizeAndTimeBasedRollingPolicy:继承自TimeBasedRollingPolicy,支持按照文件大小滚动的特性,可以通过maxFileSize来配置:

    • maxFileSize:指定单个日志文件的最大大小。当日志文件达到或超过这个大小时,将触发滚动操作。可以使用可以使用B、 KB、 MB、 GB作为单位。
  3. FixedWindowRollingPolicy:按指定的固定窗口大小滚动日志文件。该策略会创建固定数量的日志文件,并在写满一个日志文件后,将日志写入下一个文件,循环使用这些日志文件。可以通过 minIndexmaxIndex 属性指定日志文件的索引范围。

    • minIndex:指定最小索引值。当滚动时,索引将从这个值开始递增。默认值为1。
    • maxIndex:指定最大索引值。当索引达到这个值时,最旧的日志文件将被删除。默认值为7。

过滤器

在Logback中,可以使用Filter来对日志事件进行筛选和过滤。常用的过滤器有:ThresholdFilterLevelFilter

  1. ThresholdFilter:基于日志级别进行过滤,只有达到或超过指定级别的日志事件才会被接受。以下是一个示例配置:

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>WARN</level></filter>
    </appender>
    
  2. LevelFilter:LevelFilter也是基于日志级别进行过滤,可以根据指定的最低日志级别(level)来决定是否接受或拒绝日志事件,允许更细粒度地控制不同appender或logger的过滤行为。以下是一个示例配置:

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>DENY</onMatch><onMismatch>ACCEPT</onMismatch></filter>
    </appender>
    

    <onMatch>标签指定了满足过滤条件时的操作为DENY(拒绝),<onMismatch>标签指定了未满足过滤条件时的操作为ACCEPT(接受)。

springboot中如何通过日志切面将业务和日志进行解耦

在我们的应用中,经常需要记录每一次请求的参数、请求的结果、耗时以及请求异常时需要记录异常堆栈,用来在必要的时候排查问题。如果直接记录的话,存在日志和代码耦合,日志风格不统一,日志排查困难等问题,所以我们往往通过AOP的方式将日志和代码进行解耦,让程序员可以专注在业务的开发上。

@Aspect
@Component
@Slf4j
public class LogAspect {@Around(value = "execution(* com.pinellia.framework.controller.*.*(..))")public Object logRequest(ProceedingJoinPoint joinPoint) throws Throwable {StopWatch stopWatch = new StopWatch();stopWatch.start();HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();String requestUrl = request.getRequestURL().toString();Object result = null;try {result = joinPoint.proceed();} catch (Throwable e) {log.error("Request url: {} failed...", requestUrl, e);throw e;} finally {stopWatch.stop();log.info("Request url: {}, params: {}, response: {}, cost: {}",requestUrl, joinPoint.getArgs(), GsonUtil.toJson(result), stopWatch.getTotalTimeMillis());}return result;}
}

相关文章:

Springboot中如何记录好日志

Springboot中如何记录日志 日志体系整体介绍 日志一直在系统中占据这十分重要的地位&#xff0c;他是我们在系统发生故障时用来排查问题的利器&#xff0c;也是我们做操作审计的重要依据。那么如何记录好日志呢&#xff1f;选择什么框架来记录日志&#xff0c;是不是日志打越…...

vm 虚拟机中ubuntu环境配置共享文件夹的方式

1. 在虚拟机设置中启用共享文件夹选项&#xff0c;映射到Windows中具体的目录。 2. 启动虚拟机。 3. 挂在cd #查看cd设备文件 sudo blkid#创建挂载点 sudo mkdir -p /media/cdrom#挂载cd sudo mount /dev/sr0 /media/cdrom#卸载cd sudo umount /media/cdrom 4. 执行完挂载后…...

EMQX Enterprise 5.5 发布:新增 Elasticsearch 数据集成

EMQX Enterprise 5.5.0 版本已正式发布&#xff01; 在这个版本中&#xff0c;我们引入了一系列新的功能和改进&#xff0c;包括对 Elasticsearch 的集成、Apache IoTDB 和 OpenTSDB 数据集成优化、授权缓存支持排除主题等功能。此外&#xff0c;新版本还进行了多项改进以及 B…...

安全架构设计理论与实践

一、考点分布 安全架构概述&#xff08;※※&#xff09;安全模型&#xff08;※※※&#xff09;信息安全整体架构设计网络安全体系架构设计区块链技术&#xff08;※※&#xff09; 二、安全架构概述 被动攻击&#xff1a;收集信息为主&#xff0c;破坏保密性 主动攻击&#…...

SQL注入漏洞解析--less-46

我们先看一下46关 他说让我们先输入一个数字作为sort,那我们就先输入数字看一下 当我们分别输入1&#xff0c;2&#xff0c;3可以看到按照字母顺序进行了排序&#xff0c;所以它便是一个使用了order by语句进行排序的查询的一种查询输出方式 当输入时出现报错提示&#xff0c;说…...

【算法与数据结构】回溯算法、贪心算法、动态规划、图论(笔记三)

文章目录 七、回溯算法八、贪心算法九、动态规划9.1 背包问题9.2 01背包9.3 完全背包9.4 多重背包 十、图论10.1 深度优先搜索10.2 广度优先搜索10.3 并查集 最近博主学习了算法与数据结构的一些视频&#xff0c;在这个文章做一些笔记和心得&#xff0c;本篇文章就写了一些基础…...

【pytorch】常用代码

文章目录 条件与概率torch.tensor()torch.rand()torch.randn()torch.randint()torch.multinominal() 逻辑运算torch.argmax()torch.max()torch.sum()torch.tanh()torch.pow() 功能性操作 torch.nn.functionalF.normalize()F.elu()F.relu()F.softmax() 张量计算torch.zeros()tor…...

GB28181 —— Ubuntu20.04下使用ZLMediaKit+WVP搭建GB28181流媒体监控平台(连接带云台摄像机)

最终效果 简介 GB28181协议是视频监控领域的国家标准。该标准规定了公共安全视频监控联网系统的互联结构, 传输、交换、控制的基本要求和安全性要求, 以及控制、传输流程和协议接口等技术要求,是视频监控领域的国家标准。GB28181协议信令层面使用的是SIP(Session Initiatio…...

图片录入设备、方式与质量对图片转Excel的影响

随着数字化时代的到来&#xff0c;图片已经成为人们日常生活中不可或缺的一部分。在各行各业中&#xff0c;图片的应用越发广泛&#xff0c;从而促使了图片处理技术的快速发展。然而&#xff0c;图片的质量对于后续数据处理和分析的准确性和可靠性有着至关重要的影响。本文将从…...

Linux:ACL权限,特殊位和隐藏属性

目录 一.什么是ACL 二.操作步骤 ① 添加测试目录、用户、组&#xff0c;并将用户添加到组 ② 修改目录的所有者和所属组 ③ 设定权限 ④ 为临时用户分配权限 ⑤ 验证acl权限 ⑥ 控制组的acl权限 三. 删除ACL权限 一.什么是ACL 访问控制列表 (Access Control List):ACL 通…...

FL Studio21中文版本价格多少?值不值得购买?

FL Studio&#xff0c;也被称为Fruity Loops&#xff0c;是一款非常受欢迎的数字音频工作站&#xff08;DAW&#xff09;&#xff0c;适合广泛的音乐制作人群使用。以下是适合使用FL Studio的人群&#xff1a; 初学者&#xff1a;FL Studio拥有直观且用户友好的界面&#xff0c…...

【论文阅读】ICCV 2023 计算和数据高效后门攻击

文章目录 一.论文信息二.论文内容1.摘要2.引言3.主要图表4.结论 一.论文信息 论文题目&#xff1a; Computation and Data Efficient Backdoor Attacks&#xff08;计算和数据高效后门攻击&#xff09; 论文来源&#xff1a; 2023-ICCV&#xff08;CCF-A&#xff09; 论文团…...

JavaAPI常用类03

目录 java.lang.Math Math类 代码 运行 Random类 代码 运行 Date类/Calendar类/ SimpleDateFormat类 Date类 代码 运行 Calendar类 代码 运行 SimpleDateFormat类 代码一 运行 常用的转换符 代码二 运行 java.math BigInteger 代码 运行 BigDecimal …...

SpringBoot/Java中OCR实现,集成Tess4J实现图片文字识别

场景 Tesseract Tesseract是一个开源的光学字符识别&#xff08;OCR&#xff09;引擎&#xff0c;它可以将图像中的文字转换为计算机可读的文本。 支持多种语言和书面语言&#xff0c;并且可以在命令行中执行。它是一个流行的开源OCR工具&#xff0c;可以在许多不同的操作系…...

【深度学习目标检测】十九、基于深度学习的芒果计数分割系统-含数据集、GUI和源码(python,yolov8)

使用深度学习算法检测芒果具有显著的优势和应用价值。以下是几个主要原因&#xff1a; 特征学习的能力&#xff1a;深度学习&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;能够从大量的芒果图像中自动学习和提取特征。这些特征可能是传统方法难以手动…...

骑砍战团MOD开发(48)-多人联机模式开发环境搭建

一.多人联机模式网络拓扑图 <1.局域网网络拓扑图 <2.互联网网络拓扑图 二.多人联机模式配置 MOD目录下module.ini修改配置项 has_multiplayer 1 has_single_player 1 三.服务端创建 引擎内置presentation页面: prsnt_game_multiplayer_admin_panel start_multi…...

Java+SpringBoot+Vue+MySQL:美食推荐系统的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…...

【服务发现--ingress】

1、ingress介绍 Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 Ingress 是对集群中服务的外部访问进行管理的 API 对象&#xff0c;典型的访问方式是 HTTP。 Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟…...

Yolov8有效涨点:YOLOv8-AM,添加多种注意力模块提高检测精度,含代码,超详细

前言 2023 年&#xff0c;Ultralytics 推出了最新版本的 YOLO 模型。注意力机制是提高模型性能最热门的方法之一。 本次介绍的是YOLOv8-AM&#xff0c;它将注意力机制融入到原始的YOLOv8架构中。具体来说&#xff0c;我们分别采用四个注意力模块&#xff1a;卷积块注意力模块…...

苹果分拣检测YOLOV8NANO

苹果分拣&#xff0c;可以检测成熟、切片、损坏、不成熟四种类型&#xff0c;YOLOV8NANO&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C,PYTHON 苹果分拣检测YOLOV8NANO&#xff0c;检测四种类型苹果...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python&#xff0c;或者java 的大型项目中&#xff0c;都会涉及到 自身平台微服务之间的相互调用&#xff0c;以及和第三发平台的 接口对接&#xff0c;那在python 中是怎么实现的呢&#xff1f; 在 Python Web 开发中&#xff0c;FastAPI 和 Django 是两个重要但定位不…...