SpringBoot 日志 与 门面模式(外观模式)

日志的使用

先引入日志对象,注意是 引入的是 org.slf4j 这个包下的 Logger

在这里插入图片描述


在传参上:可以传入类名,或者一个字符串,该参数表示日志名称

例如如果传入 “aaaa”,那么日志的名称就是 aaaa

@RequestMapping("/log")
@RestController
public class LogController {private final static Logger logger = LoggerFactory.getLogger("aaaa");@RequestMapping("/print")public void print() {logger.debug("logger debug");logger.info("logger info");logger.error("logger error");logger.trace("logger trace");logger.warn("logger warn");}
}

在这里插入图片描述

如果传入类名,日志的名称为全限定名(包名 + 类名)

package org.example.springcaptcha.log.controller;@RequestMapping("/log")
@RestController
public class LogController {private final static Logger logger = LoggerFactory.getLogger(LogController.class);@RequestMapping("/print")public void print() {logger.debug("logger debug");logger.info("logger info");logger.error("logger error");logger.trace("logger trace");logger.warn("logger warn");}
}

在这里插入图片描述

日志的等级

在运行上述代码后并访问之后,我们获得如下的访问内容:

在这里插入图片描述

你会发现这个日志只打印了三条,因为日志默认打印的起始等级为 info

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

在这里插入图片描述

FATAL 在这里没有方法提供给我们使用
默认的的打印等级最低为 info


如何设置默认的打印等级:
使用配置文件来进行修改:

示例: yml 格式

logging:level:root: debug

properties 格式:

logging.level.root=debug

在这里插入图片描述

SLF4J 框架介绍

SLF4J 是其他日志框架的门面,SLF4J 可以理解为是提供日志服务的统一 API 接口,并不涉及到具体日志逻辑实现

在这里插入图片描述

不引入日志门面的话存在哪些问题:
1.不同的日志框架提供的 API 接口和配置文件不同,如果多个日志框架并存,那么不得不维护多套配置文件(该配置文件指用户自定义的配置文件)
2. 如果要更换日志框架,应用程序不得不修改代码,并且修改过程中可能会存在一些代码冲突
3. 如果引入的第三方框架,使用了多套,那就不得不维护多套配置

引入日志门面之后
应用程序和日志框架之间有了统一的API 接口,此时应用程序只需要维护一套日志文件的配置,且当底层实现框架改变的时候,也不需要更改应用程序的代码

门面模式(外观模式)

门面模式又被称为外观模式,提供了统一的接口,用来访问子系统
其主要的特征为定义了一个高层接口,让子系统更容易使用

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

示例:通过门面统一控制灯的开与关

子系统实现:

public interface Light {void on();void off();
}public class BedRoomLight implements Light {@Overridepublic void on() {System.out.println("卧室灯亮");}@Overridepublic void off() {System.out.println("卧室灯灭");}
}public class HallLight implements Light {@Overridepublic void on() {System.out.println("走廊灯亮");}@Overridepublic void off() {System.out.println("走廊灯灭");}
}public class LivingRoomLight implements Light {@Overridepublic void on() {System.out.println("客厅灯亮");}@Overridepublic void off() {System.out.println("客厅灯灭");}
}

门面实现:

public class FacadeCilent {BedRoomLight bedRoomLight = new BedRoomLight();HallLight hallLight = new HallLight();LivingRoomLight livingRoomLight = new LivingRoomLight();public void on() {bedRoomLight.on();hallLight.on();livingRoomLight.on();}public void off() {bedRoomLight.off();hallLight.off();livingRoomLight.off();}
}

测试类:

public class Test {public static void main(String[] args) {FacadeCilent facadeCilent = new FacadeCilent();facadeCilent.off();facadeCilent.on();}
}

日志格式说明

在这里插入图片描述
在这里插入图片描述

日志的持久化保存

我们依旧要使用配置文件来定义日志保存的路径或者文件夹,以及日志的分割等信息

配置日志的保存的文件夹:
yml:

logging:file:name: logger/springboot.log

properties:

logging.file.name=logger/springboot.log

创建好 logger 文件夹之后并且将文件 springboot.log 也创建出来了:
在这里插入图片描述


配置日志保存的路径:
yml:

logging:file:path: D:/code

properties:

logging.file.path=D:/code

会在指定的路径下生成 spring.log 文件

在这里插入图片描述

当logging.file.name 和 logging.file.path 两个配置都存在的情况下,只能生效其中一个,以 logging.file.name 为准


日志的分割:
我们可以通过配置文件来定义多大空间的日志就进行一次分割

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

max-file-size 设置日志文件的最大值
file-name-pattern 设置日志文件的文件名称格式

在这里插入图片描述

日志的简单使用

使用 lombok 下 的 注解:@Slf4j

我们可以直接使用变量 log 来进行日志的打印:

@RequestMapping("/log2")
@RestController
@Slf4j
public class LogController2 {@RequestMapping("/print")public void print() {log.debug("logger debug");log.info("logger info");log.error("logger error");log.trace("logger trace");log.warn("logger warn");}
}

我们可以在 target 文件夹下观察到 @Slf4j 直接消失,多出来一个 Logger 对象,并且对象名为 log
因此我们可以直接使用 log 来进行日志的打印

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL篇】数据类型

目录 前言: 1,数据类型的分类 ​编辑 2 ,数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float类型 2.3.2 decimal类型 3,字符串类型 3.1 char 3.2 varchar 3.3 char与varchar的比较 3.4日期和时间类型 3.5 …

网络类型及数据链路层协议

网络类型的分类: p2p----point to point---点到点网络MA---Multi-Access---多点接入网络 BMA--- Broadcast Multi-Access Network ---广播型多点接入网络NBMA--- Non-Broadcast Multi-Access Network ---非广播型多点接入网络 数据链路层协议: MA网络…

序列化选型:字节流抑或字符串

序列化既可以将对象转换为字节流,也可以转换为字符串,具体取决于使用的序列化方式和场景。 转换为字节流 常见工具及原理:在许多编程语言中,都有将对象序列化为字节流的机制。例如 Python 中的 pickle 模块、Java 中的对象序列化…

企业微信里可以使用的企业内刊制作工具,FLBOOK

如何让员工及时了解公司动态、行业资讯、学习专业知识,并有效沉淀企业文化?一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网,注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…

Java 大视界 -- Java 大数据在智能安防入侵检测与行为分析中的应用(108)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

Spring IoC

前言: 我们介绍下Spring. 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 这么说可能还是很抽象.用一句话概括就是Spring就是一个包含了众多工具和方法的IoC容器. 所…

如何配置虚拟机的IP上网

一.配置vm虚拟机网段 在虚拟机主页点击编辑->虚拟网络编辑器,选择VMnet8,要改动两个地方: 1.子网IP改成192.168.10.0 2.NAT设置->192.168.10.2 让所有的vm配置的虚拟机使用NAT时,它们的网段都是一致的。注意:这里的第三个部…

Java GC 基础知识快速回顾

目录 一、Java 垃圾回收(GC)基本概念和重要性分析 (一) Java 垃圾回收(GC)基本概念回顾 1.GC 三种常见语义 2.Mutator:应用程序的内存管理角色 3.TLAB(线程本地分配缓存&#x…

【Linux】Linux权限

1 Linux权限概念 Linux下有两种用户:超级用户(root),普通用户 超级用户:可以再linux系统下做任何事情,不受限制。 普通用户:在linux下做有限的事情。 超级用户的命令提示符是“#”,普通用户的命令提示符是…

Linux笔记---缓冲区

1. 什么是缓冲区 在计算机系统中,缓冲区(Buffer) 是一种临时存储数据的区域,主要用于协调不同速度或不同时序的组件之间的数据传输,以提高效率并减少资源冲突。它是系统设计中的重要概念,尤其在I/O操作、网…

Tomcat基础知识及其配置

1.Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服…

机器学习数学通关指南

✨ 写在前面 💡 在代码的世界里沉浸了十余载,我一直自诩逻辑思维敏捷,编程能力不俗。然而,当我初次接触 DeepSeek-R1 并领略其清晰、系统的思考过程时,我不禁为之震撼。那一刻,我深刻意识到:在A…

数据结构之八大排序算法详解

目录 一、冒泡排序(Bubble Sort)原理代码实现时间复杂度 二、选择排序(Selection Sort)原理代码实现时间复杂度 三、插入排序(Insertion Sort)原理代码实现时间复杂度 四、希尔排序(Shell Sort&…

RocketMQ的运行架构

目录 1. 核心组件(1) NameServer(2) Broker(3) Producer(4) Consumer 2. 消息流转流程3. 高可用机制4. 扩展性与负载均衡5.容错机制5. 特殊功能支持6. 典型部署架构总结 RocketMQ 是一款高性能、高可靠的分布式消息中间件,其运行架构设计为分布式、可扩展、高可用的…

【AIGC系列】5:视频生成模型数据处理和预训练流程介绍(Sora、MovieGen、HunyuanVideo)

AIGC系列博文: 【AIGC系列】1:自编码器(AutoEncoder, AE) 【AIGC系列】2:DALLE 2模型介绍(内含扩散模型介绍) 【AIGC系列】3:Stable Diffusion模型原理介绍 【AIGC系列】4&#xff1…

算法日记32:15届蓝桥C++B填空(握手问题+小球反弹)

握手问题 一、题解 1、通过观察我们可以发现,题目属于数论中的蜂巢问题,但是我们这里不使用结论,而是通过分析推出 2、假设我们不考虑特殊情况(也就是那 7 7 7个人的情况),那么问题的答案应该为 int res0; for(int i49;i>1;i…

【三维分割】LangSplat: 3D Language Gaussian Splatting(CVPR 2024 highlight)

论文:https://arxiv.org/pdf/2312.16084 代码:https://github.com/minghanqin/LangSplat 文章目录 一、3D language field二、回顾 Language Fields的挑战三、使用SAM学习层次结构语义四、Language Fields 的 3DGS五、开放词汇查询(Open-voca…

Windows安装sql server2017

看了下官网的文档,似乎只有ubuntu18.04可以安装,其他debian系的都不行,还有通过docker的方式安装的。 双击进入下载的ISO,点击执行可执行文件,并选择“是” 不要勾选 警告而已,不必理会 至少勾选这两…

LabVIEW图像识别抗干扰分析

问题描述 在基于LabVIEW的探针定位系统中,存在两个核心技术难点: 相机畸变导致初始定位误差:非线性畸变使探针无法通过坐标变换直接精确定位,需采用粗定位图像修正的两段式控制策略。 图像识别可靠性不足:复杂背景&a…

Leetcode1 两数之和 python两种方法实现

Leetcode1 两数之和 python两种方法实现 文章目录 Leetcode1 两数之和 python两种方法实现方法一:枚举法(暴力解法)方法二:用空间换时间。 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为…