【JavaEE】Spring Boot 日志详解

news2024/11/27 9:32:39

一 日志概述

  • 日志是用于记录系统运行状态、用户操作和重大事件的工具。
1.日志的用途
  1. 系统监控
    监控现在几乎是一个成熟系统的标配, 我们可以通过日志记录这个系统的运行状态, 每⼀个方法的响应时间, 响应状态等, 对数据进行分析, 设置不同的规则, 超过阈值时进行报警. 比如统计日志中关键字的数量,并在关键字数量达到一定条件时报警,这也是日志的常见需求之⼀
  2. 数据采集
    数据采集是⼀个比较大的范围, 采集的数据可以作用在很多方面, 比如数据统计, 推荐排序等
    • 数据统计: 统计页面的浏览量(PV), 访客量(UV), 点击量等, 根据这些数据进行数据分析, 优化公司运营策略
    • 推荐排序: 目前推荐排序应用在各个领域, 我们经常接触的各行各业很多也都涉及推荐排序, 比如购物, 广告, 新闻等领域. 数据采集是推荐排序工作中必须做的一环, 系统通过日志记录用户的浏览历史, 停留时长等, 算法人员通过分析这些数据, 训练模型, 给用户做推荐.
  3. 日志审计
    随着互联网的发展,众多企业的关键业务越来越多的运行于网络之上. 网络安全越来越受到大家的关注, 系统安全也成为了项目中的⼀个重要环节, 安全审计也是系统中非常重要的部分. 国家的政策法规、行业标准等都明确对日志审计提出了要求. 通过系统日志分析,可以判断一些非法攻击, 非法调用,以及系统处理过程中的安全隐患.
2.日志的类型
  • 诊断日志:记录请求入口出口、外部服务调用、资源消耗操作等,有助于技术团队理解和解决具体问题。
  • 统计日志:涉及用户访问统计和计费信息,对分析产品使用模式和进行计费非常重要。
  • 审计日志:记录管理操作和安全事件,对维护系统的安全性和合规性至关重要。
  • 操作日志:记录系统操作员的操作轨迹,为后续审计和问题追踪提供依据。
  • 安全日志:专注于记录登录信息、权限变更等安全相关事件。

二.打印日志

@RequestMapping("/logger")
@RestController

public class LoggerController {
    private static Logger logger = LoggerFactory.getLogger(LoggerController.class);

    @RequestMapping("/test")
    public String test() {
        logger.info("------------打印日志---------------");
        return "success";
    }
}
 

在这里插入图片描述

1.SLF4J
  • 即简单日志门面(Simple Logging Facade for Java),是一个抽象层,使得用户可以在不修改代码的情况下切换底层的日志系统。这极大地方便了开发人员在不同的日志系统间进行选择和迁移, 允许用户在部署其应用程序时插入所希望的日志系统。它自身不直接实现日志功能,而是提供了一个通用的API,通过这个API可以接入多种不同的日志框架
  • SLF4J的主要特点
    • 门面模式的应用:SLF4J是门面模式的典型应用,它本身不包含业务逻辑,而是定义了一组接口并将客户端请求委派给相应的日志实现框架处理。
    • 灵活的日志系统切换:通过更换相应的适配器,可以在不同日志系统如Log4j, java.util.logging等之间自由切换,而无需修改应用程序代码。
2.门面模式(外观模式)
  • 门面模式(Facade Pattern)又称为外观模式, 提供了一个统一的接口, 用来访问子系统中的一群接口.
  • 门面模式主要包含2种角色:
    • 外观角色(Facade): 也称门面角色,系统对外的统一接口.
    • ⼦系统角色(SubSystem): 可以同时有⼀个或多个 SubSystem. 每个 SubSytem 都不是一个单独的类,而是⼀个类的集合. SubSystem 并不知道 Facade 的存在, 对于 SubSystem 而言, Facade 只是另一个客户端而已(即 Facade 对 SubSystem 透明)

在这里插入图片描述
举个例子比如去医院看病,可能要去挂号, 门诊, 化验, 取药, 让患者或患者家属觉得很复杂, 如果有提供接待人员, 只让接待人员来处理, 就很方便.
在这里插入图片描述

  • 门面模式的优点:
    • 减少了系统的相互依赖. 实现了客户端与子系统的耦合关系, 这使得子系统的变化不会影响到调用它的客户端;
    • 提高了灵活性, 简化了客户端对子系统的使用难度, 客户端无需关心子系统的具体实现方式, 而只需要和门面对象交互即可.
    • 提高了安全性. 可以灵活设定访问权限, 不在门面对象中开通方法, 就无法访问.

三.日志格式详细说明

在这里插入图片描述

    1. 时间日期:精确到毫秒
    1. 日志级别:ERROR, WARN, INFO, DEBUG 或TRACE
    1. 进程ID
    1. 线程名
    1. Logger名(通常使⽤源代码的类名)
    1. 日志内容
日志级别

日志的级别从高到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE

  • FATAL: 致命信息,表示需要立即被处理的系统级错误.
  • ERROR: 错误信息, 级别较高的错误日志信息, 但仍然不影响系统的继续运行.
  • WARN: 警告信息, 不影响使用, 但需要注意的问题
  • INFO: 普通信息, 用于记录应用程序正常运行时的一些信息, 例如系统启动完成、请求处理完成等.
  • DEBUG: 调试信息, 需要调试时候的关键信息打印.
  • TRACE: 追踪信息, 比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG级别替代)


==日志级别通常和测试人员的Bug级别没有关系.==日志级别是开发人员设置的, 用来给开发人员看的. 日志级别的正确设置, 也与开发人员的工作经验有关. 如果开发人员把error级别的日志设置成了info, 就很有可能会影响开发人员对项目运行情况的判断. 出现error级别的日志信息较多时, 可能也没有任何问题. 测试的bug级别更多是依据现象和影响范围来判断

@RequestMapping("/logger")
@RestController
public class LoggerController {
    private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
    @RequestMapping("/level")
    public String level() {
        logger.error("-----------error级别的日志------------");
        logger.warn("-----------warn级别的日志------------");
        logger.info("-----------info级别的日志------------");
        logger.debug("-----------debug级别的日志------------");
        logger.trace("-----------trace级别的日志------------");
        return "success";
    }
}

在这里插入图片描述
结果发现, 只打印了info, warn和error级别的日志
这与日志级别的配置有关, 日志的输出级别默认是 info级别, 所以只会打印大于等于此级别的日志, 也就是info, warn和error.

四.日志配置

  • 日志的配置只需要在application.yml或者application.properties里面设置相应的配置即可.
1.配置日志的输出级别

properties日志设置,设置日志级别为debug

logging.level.root: debug

yml日志设置,设置日志级别为debug

logging:
 level:
 root: debug

在这里插入图片描述

2.配置日志的持久化存储
  • 以上的日志都是输出在控制台上的, 然而在线上环境中, 我们需要把日志保存下来, 以便出现问题之后追溯问题. 把日志保存下来就叫持久化.
  • 日志持久化有两种方式:
      1. 配置日志文件名
      1. 配置日志的存储目录
        在这里插入图片描述
  1. 配置日志文件的路径和文件名:

properties日志设置

logging.file.name: logger/springboot.log

yml日志设置
logging:
file:
name: logger/springboot.log

在这里插入图片描述

  1. 配置日志文件的保存路径

properties日志设置

logging.file.path: logger

yml日志设置

logging:
  file:
    path: logger

在这里插入图片描述

注意:

  1. logging.file.name 和 logging.file.path 两个都配置的情况下, 只生效其⼀, 以logging.file.name 为准.
  2. logging.file.name既能设置路径也能设置名称, logging.file.path只能设置路径默认的文件路径名为spring.log
3.配置日志文件分割
  • 如果我们的日志都放在一个文件中, 随着项目的运行, 日志文件会越来越大, 需要对日志文件进行分割.
  • 当然, 日志框架也帮我们考虑到了这一点, 所以如果不进行配置, 就走自动配置,默认日志文件超过10M就进分割.
    在这里插入图片描述
    更多详细配置可以去官网查看:
    https://springdoc.cn/spring-boot/application-properties.html#application-properties.core.logging.logback.rollingpolicy.file-name-pattern

配置日志文件分割:Properties配置

logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i
logging.logback.rollingpolicy.max-file-size=1KB

配置日志文件分割:yml配置

logging:
 logback:
 rollingpolicy:
 max-file-size: 1KB
 file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
3.配置日志格式
  • 控制台日志格式:

    1. 配置项:logging.pattern.console
    2. 默认值:
      %clr(%d{KaTeX parse error: Unexpected character: '' at position 33: …ATTERN:-yyyy-MM̲dd'T'HH:mm:ss.S…{LOG_LEVEL_PATTERN:-%5p}) %clr( P I D : − ) m a g e n t a f a i n t {PID:- }){magenta} %clr(---){faint} %clr([%15.15t]) {faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n PID:)magentafaint{LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
  • 日志文件的日志格式:

    1. 配置项:logging.pattern.file
    2. 默认值:%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MMdd’T’HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} P I D : − − − − [ {PID:- }--- [%t] %-40.40logger{39}:%m%n PID:[{LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
  • 配置项说明:

    1. %clr(表达式){颜色} 设置输入日志的颜色 默认支持blue cyan faint green magenta red yellow这几种颜色.

    2. %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd’T’HH:mm:ss.SSSXXX}} 日期和时间–精确到毫秒.

      %d{} ⽇期
      ${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd’T’HH:mm:ss.SSSXXX} 非空表达式, 获取
      系统属性 LOG_DATEFORMAT_PATTERN , 若属性 LOG_DATEFORMAT_PATTERN 不存在,则使
      用 -yyyy-MM-dd HH:mm:ss.SSSXXX 格式, 系统属性可以
      System.getProperty(“LOG_DATEFORMAT_PATTERN”) 获取

    3. %5p 显示日志级别ERROR,MARN,INFO,DEBUG,TRACE.

    4. %t 线程名. %c 类的全限定名. %M method. %L 为行号. %thread 线程名称. %m 或者%msg 显示输出消息. %n 换行符

    5. %5 若字符长度小于5,则右边用空格填充. %-5 若字符长度小于5,则左边用空格填充. %.15 若字符长度超过15,截去多余字符. %15.15 若字符长度小于15,则右边用空格填充. 若字符长度超过15,截取多余字符

日志格式Properties配置

logging.pattern.console='%d{yyyy-MM-dd HH:mm:ss.SSS} %C %M %L [%thread] %m%n'

日志格式yml配置

logging:
 pattern:
 console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
 file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %C %M %L [%thread] %m%n'

五.更简单的日志输出.

  • 每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐, 且每个类都添加⼀遍, lombok给我们提供了一种更简单的方式
    • 添加 lombok 框架支持
    • 使用 @slf4j 注解输出日志

Lombok依赖:

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

使用注解:

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LogController {
 public void log(){
 log.info("--------------要输出⽇志的内容----------------");
 }
}

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

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

相关文章

数据库资源评估:构建高效数据架构的基础

前言 这篇文章主要是描述在平时开发的过程中怎么进行合理的资源评估&#xff0c;包括数据量预估、用户行为建模、资源预估、资源预览等等。 存储架构设计三步骤 性能估算步骤 用户预估常见方式 用户行为建模 存储性能需求计算 存储性能需求计算案例 案例 用户行为模型:每天使…

【二进制部署k8s-1.29.4】十三、k8s的dashboard安装部署【完结】

文章目录 简介 一.kubernetes-dashboard-7.5.0的安装1.1 查看helm安装的参数1.2 安装命令 二.验证安装结果2.1.验证2.2.配置访问&#xff1a; 三.创建BearerToken来进行登录3.1.创建 ServiceAccount 和 Secret3.2.创建集群绑定3.3.查看token 四.登录注意事项 简介 本章节主要讲…

通过fiftyone按分类下载open-images-v7数据集,并转成yolov5可直接训练的格式

import osimport fiftyone as fo import fiftyone.zoo as foz import yamlclasses [Person, # 人 - 0Car, # 轿车 - 1Taxi, # 出租车 - 2Ambulance, # 救护车 - 3Bus, # 公共汽车 - 4Bicycle, # 自行车 - 5Motorcycle, # 摩托车 - 6Dog, # 狗 - 7Cat, # 猫 - 8M…

Django里的ModelForm组件

ModelForm组件 自动生成HTML标签 自动读取关联数据表单验证 错误提示数据库进行&#xff1a;新建&#xff0c;修改 步骤如下&#xff1a; 创建类 # 在 views.py 文件里# 创建一个类 class AssetModelForm(forms.ModelForm):class Meta:model models.AssetSet #fields [n…

Python Flask实现蓝图Blueprint配置和模块渲染

Python基础学习&#xff1a; Pyhton 语法基础Python 变量Python控制流Python 函数与类Python Exception处理Python 文件操作Python 日期与时间Python Socket的使用Python 模块Python 魔法方法与属性 Flask基础学习&#xff1a; Python中如何选择Web开发框架&#xff1f;Pyth…

《大道平渊》· 拾 —— 身心的“肥胖”与我们不知饥渴的病:追求中的丰盈与节制

《平渊》 拾 "水满则溢&#xff0c;月盈则亏。" 《道德经》有言&#xff1a;"水满则溢&#xff0c;月盈则亏"。 意思是&#xff1a;水满了就会溢出&#xff0c;月亮最圆的时候就会走向亏的状态。 这揭示了自然界和人类社会中一切事物的内在规律 —— 任…

经典算法 - 回溯法

文章目录 1. 基本概念2. 组合问题3. 组合总和Ⅲ4. 电话号码的字母组合5. 分割回文串6. 复原IP地址7. 子集8. 全排列9. 全排列Ⅱ10. N皇后11. 解数独 1. 基本概念 递归和回溯相辅相成。只要有递归&#xff0c;就会有回溯。 回溯法是一种纯暴力的搜索&#xff0c;并不是一种高效…

特征选择|模型解释|Pearson相关系数|JS散度|SHAP算法

文章目录 1 特征工程2 特征选择3 相关性分析3.1 皮尔逊相关系数3.2 皮尔逊相关系数 - python实现3.3 JS散度3.4 JS散度 - python实现 4 模型解释算法4.1 SHAP4.2 SHAP - python实现4.3 SHAP值解读4.4 SHAP 瀑布图4.5 SHAP 柱状图4.6 SHAP 蜂巢图4.7 SHAP其他图像形式4.7.1 单点…

selenium非全新的方式同时启动多个浏览器又互不影响的一种实现方法,欢迎讨论!

最近在做模拟浏览器批量定时自动点击实现批量操作功能&#xff0c;主要使用selenium&#xff0c;但是发现selenium直接调用本地浏览器&#xff0c;启动的是一个全新的&#xff08;与手动打开的不一致&#xff09;&#xff0c;网站可以检测到&#xff0c;每次都要双重验证(密码登…

Elasticsearch 管道查询语言 ES|QL 现已正式发布

作者&#xff1a;Costin Leau, George Kobar 今天&#xff0c;我们很高兴地宣布 ES|QL&#xff08;Elasticsearch 查询语言&#xff09;全面上市&#xff0c;这是一种从头开始设计的动态语言&#xff0c;用于转换、丰富和简化数据调查。在新的查询引擎的支持下&#xff0c;ES|Q…

14_Node.js和NPM入门指南

文章目录 NodeJS1.nodejs下载2.NPM的配置和使用3.NPM对一个项目进行初始化操作4.NPM本地仓库进行依赖下载5.查看当前项目有哪些依赖 https://www.npmjs.com/package NodeJS JS代码运行在哪里 1.浏览器2.nodejs 内置谷歌浏览器v8引擎 nodejs具有io磁盘 读写能力。类似java代码和…

找嵌入式软件工作,freertos要掌握到什么程度?

对于嵌入式软件工程师来说&#xff0c;掌握RTOS&#xff08;实时操作系统&#xff09;的程度并不是决定性因素&#xff0c;而更重要的是工程思维和解决问题的能力。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式…

AI炒股:用kimi获取美股实时行情数据并保存到Excel

在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 获取美股实时美股行情数据&#xff0c;然后保存在F盘的Excel文件中&#xff0c;Excel文件名为&#xff1a;usstock20240605.xlsx 实…

创新实训2024.06.03日志:完善Baseline Test框架、加入对Qwen-14B的测试

1. Baseline Test框架重构与完善 在之前的一篇博客中&#xff08;创新实训2024.05.29日志&#xff1a;评测数据集与baseline测试-CSDN博客&#xff09;&#xff0c;我介绍了我们对于大模型进行基线测试的一些基本想法和实现&#xff0c;包括一些基线测试的初步结果。 后来的一…

双指针问题1

文章目录 1. 移动零&#xff08;283&#xff09;2. 复写零&#xff08;1089&#xff09;3. 快乐数&#xff08;202&#xff09;4. 盛最多水的容器&#xff08;11&#xff09; 1. 移动零&#xff08;283&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 设置两个指针…

​​​​【动手学深度学习】残差网络(ResNet)的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 残差网络 &#x1f30d;3.2 练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 了解残差网络&#xff08;ResNet&#xff09;的原理和架构&#xff1b;探究残…

javaweb的新能源充电系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;充电桩管理&#xff0c;报修管理&#xff0c;新能源公告管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;充电桩&#xff0c;新…

快速了解JVM机制

1.JVM 简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。 常⻅的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; V…

基于SpringBoot+Vue电影院选票系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

查询SQL02:寻找用户推荐人

问题描述 找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 以 任意顺序 返回结果表。 结果格式如下所示。 题目分析&#xff1a; 这题主要是要看这null值会不会用&#xff0c;如果说Java玩多了&#xff0c;你去写SQL时就会有问题。在SQL中判断是不是null值用的是is null或…