Spring日志

news2024/9/22 10:05:02

1.日志的作用

  1. 定位和发现问题(主要)
  2. 系统监控
  3. 数据采集
  4. 日志审计......

2.日志的使用

2.1 ⽇志格式的说明

2.2 打印日志

Spring集成了日志框架,直接使用即可

步骤:

1.定义日志对象

2.使⽤⽇志对象打印⽇志

@RestController
public class LoggerController {
    private static Logger logger = LoggerFactory.getLogger(LoggerController.class);//(类名/类名.class)
    //从日志工厂拿到对象

    @PostConstruct
    public void print(){
        System.out.println("打印日志");
    }
}

 这里要注意几点:

  •                        (Logger是 org.slf4j 包下的)

2.3 ⽇志框架介绍

SLF4J不同于其他⽇志框架, 它不是⼀个真正的⽇志实现,而是一个抽象层.

是对⽇志框架制定的⼀种规范, 标准,接⼝.

所有SLF4J并不能独⽴使⽤,需要和具体的⽇志框架配合使⽤

2.2.1 ⻔⾯模式(外观模式)

2.2.1.1 解释

SLF4J是⻔⾯模式的典型应⽤

⻔⾯模式(外观模式), 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝. 其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤.

这里并不关心子系统的实现,只关心SLF4J(解耦)

⽐如去医院看病,可能要去挂号, ⻔诊, 化验, 取药, 让患者或患者家属觉得很复杂, 如果有提供接待⼈员, 只让接待⼈员来处理, 就很⽅便. 

2.2.1.2 实现

场景实现:

当我们回家后, 我们会开各个屋的灯. 离开家时, 我们会关闭各个屋的灯,这就会很麻烦.

而如果家⾥设置⼀个总开关, 来控制整个屋的灯就会很⽅便.

public interface Light {
    void on();
    void off();
}


public class DiningLight implements Light{
    @Override
    public void on() {
        System.out.println("打开餐厅灯");
    }

    @Override
    public void off() {
        System.out.println("关闭餐厅灯");
    }
}

public class HallLight implements Light{
    @Override
    public void on() {
        System.out.println("打开走廊灯");
    }

    @Override
    public void off() {
        System.out.println("关闭走廊灯");
    }
}

public class LivingLight implements Light{
    @Override
    public void on() {
        System.out.println("打开客厅灯");
    }

    @Override
    public void off() {
        System.out.println("关闭客厅灯");
    }
}


//对这些进行封装
//门面
public class FacadePattern {
    public void lightOn(){
        HallLight hallLight = new HallLight();
        hallLight.on();
        LivingLight livingLight = new LivingLight();
        livingLight.on();
        DiningLight diningLight = new DiningLight();
        diningLight.on();
    }
}

public class Main {
    public static void main(String[] args) {
        FacadePattern facadePattern = new FacadePattern();
        facadePattern.lightOn();
    }
}



2.2.1.3 优点 
  • 减少了系统的相互依赖.
  • 实现了客⼾端与⼦系统的耦合关系, 这使得⼦系统的变化不会影响到调⽤它的客⼾端.

2.2.2 SLF4J 框架介绍

SLF4J 就是其他⽇志框架的⻔⾯

SLF4J可以理解为是提供⽇志服务的统⼀API接⼝,并不涉及到具体的⽇志逻辑实现

①不引入日志门面:

常⻅的⽇志框架有log4J,logback等.如果⼀个项⽬已经使⽤了log4j,⽽你依赖的另⼀个类库,假如是ApacheActive MQ,它依赖于另外⼀个⽇志框架logback,那么你就需要把logback也加载进去.

存在问题:

1. 不同⽇志框架的API接⼝和配置⽂件不同, 如果多个⽇志框架共存, 那么不得不维护多套配置⽂件(这个配置⽂件是指⽤⼾⾃定义的配置⽂件).

2. 如果要更换⽇志框架, 应⽤程序将不得不修改代码, 并且修改过程中可能会存在⼀些代码冲突.

3. 如果引⼊的第三⽅框架, 使⽤了多套, 那就不得不维护多套配置.

SLF4J使代码独⽴于任意⼀个特定的⽇志API,这是⼀个对于开发API的开发者很好的思想.

 

②引入日志门面

引⼊⻔⾯⽇志框架之后,应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架实现),此时应⽤程序只需要维护⼀套⽇志⽂件配置,且当底层实现框架改变时,也不需要更改应⽤程序代码.

SLF4J 就是这个⽇志⻔⾯

 

2.4 ⽇志级别

2.4.1 ⽇志级别的分类

级别(从高到低)解释(级别越⾼, 收到的消息越少)
FATAL致命信息,表⽰需要⽴即被处理的系统级错误
ERROR错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏
WARN警告信息, 不影响使⽤, 但需要注意的问题
INFO普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等
DEBUG调试信息, 需要调试时候的关键信息打印
TRACE追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)

  

2.4.2 ⽇志级别的使⽤

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


    @PostConstruct
    public void print(){
        System.out.println("打印日志");
        logger.info("============我是日志框架打印的日志==============");
        logger.error("我是error日志");
        logger.warn("我是warn日志");
        logger.info("我是info日志");
        logger.debug("我是debug日志");
        logger.trace("我是trace日志");

    }
}

 可以看出,这里打印了error,warn,info,而没有打印debug和trace,

这是因为Spring默认的日志级别是info,所以只会打印⼤于等于此级别的⽇志,即info,warn,error.

2.5 ⽇志配置

2.5.1 配置⽇志级别

logging:
  level:
    root: debug

 此时就可以打印debug级别的日志了:

debug会打印较多日志,影响观察,可以对日志进行分目录打印

比如Spring的日志只打印info,项目日志打印debug级别(root表示根目录)

 

此时日志就少了:

 


日志也可以设置颜色(只能设置控制台的颜色):

2.5.2 ⽇志持久化

日志持久化就是把日志保存在文件中

2.5.2.1 配置⽇志⽂件的路径和⽂件名

 

2.5.2.2 配置⽇志⽂件的保存路径

 

 这种⽅式只能设置⽇志的路径, ⽂件名为固定的spring.log

2.5.2.3 比较总结

  • name既可以设置路径,又可以设置名称
  • path只能设置路径,默认名称是spring.log
  • 如果没有加路径,默认放在当前项目下
  • 如果两者同时存在,path就失效了,name的优先级要高于path

2.5.3 配置⽇志⽂件分割

  • 当然不是说,只要达到1KB就立即进行分割的,是以行来进行的,不是以字符.
  • 分割后的⽇志⽂件名为:⽇志名.⽇期.索引

2.5.4 配置⽇志格式(了解)

3. 更简单的⽇志输出

因为每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐, 并且需要每个类都添加⼀遍, 而lombok给我们提供了 ⼀种更简单的⽅式:

使⽤ @slf4j 注解输出⽇志

@Slf4j
@RestController
public class LoggerController {
    //private static Logger logger = LoggerFactory.getLogger(LoggerController.class);


    @PostConstruct
    public void print(){
        System.out.println("打印日志");
        log.info("============我是日志框架打印的日志==============");
        log.error("我是error日志");
        log.warn("我是warn日志");
        log.info("我是info日志");
        log.debug("我是debug日志");
        log.trace("我是trace日志");

    }
}

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

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

相关文章

Ecovadis认证评估什么 Ecovadis认证有哪些注意事

Ecovadis认证是一个全球性的企业可持续性评估平台,它通过评估企业在环境、劳工与人权、公平商业实践、可持续采购等四个领域的表现,帮助企业识别潜在风险,提升ESG(环境、社会和公司治理)绩效,实现可持续发展 Ecovadis认证注意事项…

Linux-文件系统与日志分析

系列文章目录 提示:仅用于个人学习,进行查漏补缺使用。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 4.Linux 命令安装(rpm、install) 5.Linux账号管理 6.Linux文件/目录权限管理 7.Linux磁盘管理/文件系统 8.Linu…

MapReduce 简单介绍

MapReduce 一、MapReduce概述二、MapReduce 基本设计思想分而治之2.2 抽象成模型2.3 上升到框架 三、MapReduce 优缺点3.1 MapReduce 的优点3.1 MapReduce 的缺点 四、MapReduce 编程模型4.1 MapReduce 分布式计算原理4.2 MapReduce 编程模型4.3 剖析 MapReduce 编程模型4.3.1 …

好书推荐!《Building LLM Apps》构建大语言模型LLM应用!一次性讲清楚!

《Building LLM Apps》这本书是一份全面而实用的指南,它不仅介绍了大型语言模型(LLM)的基础知识和前沿技术,还深入探讨了如何将这些模型应用到实际的AI应用中。 书中从对LLM的深入介绍入手,接着探讨了包括GPT 3.5、GP…

RxJava在Android中的应用

RxJava是一个基于事件流、异步和响应式编程的库,它在Android开发中广泛用于简化异步操作和事件处理。通过RxJava,我们可以以声明式方式管理异步任务,并有效整合多个数据源。 1. RxJava核心组件介绍 1.1 Observable与Observer Observable&a…

大模型面试系列-大模型算法工程师的面试题目与解答技巧详细说明

大家好,我是微学AI,今天给大家介绍一下大模型面试系列-大模型算法工程师的面试题目与解答技巧详细说明。 文章目录 大模型算法工程师面试题1. Llama 2 中使用的注意力机制是什么?描述一下查询分组注意力。2. LangChain 的结构详细描述一下。…

2024年8月15日嵌入式学习

今日主要学习线程和线程的互斥锁 pthread_cancel函数 它用于取消一个线程,当一个线程收到取消的申请时,他不会立即停止,而是在下一个取消点处结束运行,取消点是程序中一个特定的位置。如果线程在执行一个不可中断的系统调用&…

网络安全风险扫描原理及工具使用

课程目标 1.熟悉常见网络安全风险扫描工具 2.了解网络安全风险扫描原理 3.掌握扫描工具使用方法 为什么要做网络安全风险扫描? 什么是网络安全风险扫描? 通过一定的技术手段发现系统和软件存在的安全漏洞、弱口令 网络安全风险扫描的目的&#xff1…

【AI 绘画】web_ui 搭建(基于gradio)

AI 绘画- web_ui 搭建(基于gradio) 1. 内容介绍 Gradio的优势在于易用性,代码结构相比Streamlit简单,只需简单定义输入和输出接口即可快速构建简单的交互页面,更轻松部署模型。适合场景相对简单,想要快速部署应用的开发者。便于分享:gradio可以在启动应用时设置share=…

QT文件操作实战

QT文件操作实战 页面布局如下 读取文件:文件→界面文本框 采用“浏览”按钮的槽函数,编写的代码如下 void Widget::on_pushButton_clicked() {//读取txt文件,获取要打开的文件名,并将文件名(包含)填入lineEdit中// QString fileName = QFileDialog::getOpenFileName(th…

云HIS平台源码,云医院管理信息系统源码,云HIS医疗卫生管理系统源码

云医院管理信息系统源码,云HIS医疗卫生管理系统源码,医疗云HIS系统源码,自主版权二级医院应用案例 云HIS平台采用SaaS服务模式,软件使用者无需购置额外硬件设备、软件许可证及安装和维护软件系统,通过互联网浏览器在任…

YS9082HP量产工具,支持N38B开卡(ID:89D3AC32C204),解决YS9082HP N38B开卡到87%报错,状态8817,Fail:写表失败

收的固态硬盘,主控是YS9082HP,颗粒是Intel的N38B: 从网上找了个YS9082HP_MPToolV8.00.00.01.025_HPS2704M_release_N38B版本试试,倒是能识别颗粒,到87%就报错,Fail:写表失败,错误状态是8817&…

山东易注册网络科技有限公司:合伙人模式的机遇与创新

在互联网高速发展的今天,合伙人模式成为网络运营的新趋势。山东易注册网络科技有限公司以其创新的合伙人模式,为用户带来了前所未有的机遇。 加入山东易注册的合伙人,可以享受到独立搭建系统和独立服务器的权益。用户可以打造自己的独立域名和…

怎样用python函数画图像

打开Python的shell界面,如图所示。(注意我们需要已经安装了matplotlib库包)。 输入以下代码,导入我们用到的函数库。 >>> import numpy as np >>> import matplotlib.pyplot as plt 产生我们要画的的函数的数据…

数据集的简单制作和使用

数据集的简单制作和使用 参考资料:Labelme分割标注软件使用 使用labelme软件对数据集进行分割 每张图片获得一个json文件 我们看看其中一个文件,内容包含每个点在图片中的位置 我们可以自己写一个脚本(或使用别人的)将上述json…

突破传统看车局限,3DCAT实时云渲染为东风日产奇骏赋能

在当今数字化飞速发展的时代,汽车行业的营销也面临着诸多变革与挑战。线下展示由于受到场地空间的限制,往往无法全面展示所有车型,且建设成本高昂。而一些销售门店可能因位置偏僻等因素,导致客户上门看车、试驾的邀约变得困难重重…

哈工大李治军老师OS课程笔记(4)——内存管理

一 内存使用与分段(实验六) 内存是如何用起来的? 内存使用:将程序放在内存中,PC指向开始地址 重定位:修改程序中的地址(是相对地址) 什么时候完成重定位? 编译时加基址…

航空航天之归零报告

归零报告 1.技术归零报告1.1技术归零报告模板1.2撰写技术归零报告注意事项 2.管理归零报告2.1管理归零报告模板2.2撰写管理归零报告注意事项 归零报告通常指的是将项目、任务或系统的状态重置为初始状态,进行数据清零、状态复位或问题总结的报告文档。 在航空航天、…

spring揭秘02-springbean生命周期(实例化过程)

文章目录 【README】【1】spring构建应用系统分2个阶段【1.1】spring容器启动阶段【1.2】springbean实例化阶段 【2】springbean生命周期概述【3】springbean生命周期过程【3.1】**第1步-实例化bean对象**【3.2】**第2步-设置对象属性**【3.3】 第3步-检查Aware接口并设置相关依…

深入理解计算机系统 CSAPP 实验lab:Attack Lab

资源下载地址:CS:APP3e, Bryant and OHallaron CTARGET objdump -d ctarget >ctarget.txt 反汇编我们下载的ctarget打开看看 touch1: 我们期望的是getbuf执行完之后直接跳到touch1,利用缓存区溢出达到找个目的. 汇编显示call Gets之前 sub $0x28,%rsp,栈指针减小了 0x28 …