【Spring】Spring Boot 日志(8)

news2024/12/23 19:11:42

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。

博客涉及框架的重要知识点,根据序号学习即可。

目录

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。

博客涉及框架的重要知识点,根据序号学习即可。

1、日志概述

1.1学习日志的必要性

1.2日志的用途

2、日志使用

2.1打印日志

2.2日志框架

2.3门面模式(外观模式)

3、日志格式的说明

4、日志级别

4.1日志级别的分类

4.2日志级别的使用

5、日志配置

5.1配置日志级别

5.2日志持久化

5.3划分日志文件大小

5.4配置日志格式

6、简单化的日志输出

6.1添加lombok依赖

6.2使用注解@Slf4j输出日志


1、日志概述

1.1学习日志的必要性

在第一次学习编程语言的时候,我们就在使用printf或者System.out.println等打印语句打印日志了,为什么日志这么重要呢?因为在编程的学习过程中,不可能不出错,所以打印日志是最快来发现和定位问题的,或者说可以根据日志来分析程序的运行过程。

1.2日志的用途

(1)系统监控:在大数据时代,监控几乎是一个成熟系统了,我们可以通过日志记录这个系统的运行状态,响应状态,在关键时刻某规则超过了阈值则立马报警

(2)数据采集:日志可以采集数据为数据统计、推荐排序做出巨大贡献。【数据统计:统计某页面的浏览量(PV),访客量(UV),点击量等来优化公司运营策略】【推荐排序:目前推荐排序应用在各大领域,比如我们熟悉的抖音、拼多多等日流量爆炸的应用,点击推荐。数据采集是推荐排序工作中的非常重要的一步,系统通过日志记录用户的浏览历史,停留时间等,算法人员就会通过这些数据训练模型,给用户做推荐】

(3)日志审计:随着互联网的发展,越来越多的公司关键业务运行在网络在上,网络安全越来越受大家关注。通过日志分析,在公司中可以清楚的知道是谁做了某些违规操作,或者是信息泄露等等。

2、日志使用

2.1打印日志

(1)在SpringBoot项目启动时,就会有默认的日志打印,如下图所示,那么这些日志和System.out.println()打印的有什么区别呢?

可以知道System.out.println()只会打印括号里面的内容,相较于SpringBoot的打印少了很多信息。

然而SpringBoot内置了日志框架Slf4j,我们可以在程序中直接调用Slf4j来输出日志。

(2)打印日志的步骤:

①在程序中获取日志对象

②使用日志对象打印日志

注意:导包的时候别导错了!!!!Logger对象时属于org.slf4j包下的

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LoggerController {
    //在程序中获取日志对象需要使用日志工厂LoggerFactory
    //LoggerFactory.getLogger需要传递一个参数,标识这个日志的名称,这样可以更清晰的知道是哪个类输出的日志,更好定位
    private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
    //使用日志对象打印日志,info()只是一种打印日志的方法
    @RequestMapping("/logger")
    public String logger(){
        logger.info("-------------要输出的日志------------");
        return "打印日志";
    }
}

2.2日志框架

(1)

(2)SLF4J不同于其他日志框架,它不是一个真正的日志实现,而是一个抽象层,对日志框架制定的一种规范,标准,接口。所有SLF4J并不能独立使用,需要和具体的日志框架配合使用。SLF4J就是其他日志框架的门面,可以理解为是提供日志服务事务统一API接口,并不涉及到具体的日志逻辑框架

(3)那么为什么要SLF4J当门面呢?而不直接使用日志框架(即具体的日志逻辑)。当然这肯定是有原因的——假如不引入日志门面,在开发某个项目时,已经使用了log4j,然而在功能的实现时,需要依赖另一个日志框架logback,那么你又要把logback也加载进去,这样导致的就是有两个日志框架共存,不好维护配置文件,更换日志框架时修改代码,修改的代码有冲突怎么办?所以这就体现出引入日志门面的好处了,引入之后,应用程序和日志框架之间有了统一的API接口,此时只需要维护一套日志文件配置,且当底层实现框架改变时,也不需要更改应用程序的代码了

2.3门面模式(外观模式)

(1)门面模式

①SLF4J是门面模式的典型应用(但是不仅仅使用了门面模式)

②定义:门面模式(Facade Pattern)又称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。主要特征是定义了一个高层接口,让子系统更容易使用

③门面模式主要包含2种角色:

外观角色(Facade):也称门面角色,系统对外的统一接口

子系统角色(SubSystem):可以同时有一个或多个SubSystem。每个SubSystem都不是一个单独的类,而是一个类的集合。SubSystem并不知道Facade的存在,对于SubSystem而言,Facade知识另一个客户端而已(Facade对SubSystem透明)

(2)举例:

去教室自习,第一个进教室的人儿 一般先会开前灯,再开中灯,再开后灯,这样整个教室都亮了,以便更好的进行自习;自习结束时,最后一个人儿,会先关后灯,再关中灯,再关前灯后离开。

如果设置一个总开关,来控制整个教室的灯的开关就会很方便。

在这里,总灯就是外观角色,而前中后灯都是子系统角色。

(3)优点:

①减少了系统的相互依赖,实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端

②提高了灵活性,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和面向对象交互即可

③提高了安全性,可以林火设定访问权限,不在门面对象中开通方法,就无法访问




3、日志格式的说明

①时间日期:精确到秒

②日志级别

③进程ID

④线程名

⑤Logger名(通常使用源代码的类名)

⑥日志内容




4、日志级别

4.1日志级别的分类

(1)日志级别代表日志信息对应问题的严重性,为了更快的筛选符合目标的日志信息。有了日志级别就可以过滤自己想看到的信息了,比如只关注error级别的,就可以根据级别过滤出error级别的日志信息,节约开发者的信息筛选时间

(2)日志级别的分类:

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

①FATAL:致命信息,表示需要立即被处理的系统级错误

②ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续进行

③WARN:警告信息,不影响使用,是需要注意的问题

④INFO:普通信息,用于记录应用程序正常运行的一些信息,例如系统启动完成、请求处理完成等

⑤DEBUG:调试信息,需要调试时候打印关键信息

⑥TRACE:追踪信息,比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG代替)

4.2日志级别的使用

@RequestMapping("/printLog")
    public String printLog(){
        logger.trace("===trace===");
        logger.debug("===debug===");
        logger.info("===info===");
        logger.warn("===warn===");
        logger.error("===error===");
        return  "打印不同级别的日志";
    }

SpringBoot默认的日志框架是Logback,Logback没有fatal级别,它被映射到error。

观察运行结果,发现只打印了info、warn和error级别的日志,是因为日志的输出级别默认是info,所以只会打印大于等于info级别的日志,也就是info、warn、error。




5、日志配置

5.1配置日志级别

(1)Properties配置:

logger.level.root:debug

(2)yml配置:

logger:

        level:

                root:debug

5.2日志持久化

(1)开发环境上的日志都是输出到控制台上的,然而在线上环境中,我们需要把日志保存下来,以便出现问题之后追溯问题。把日志保存下来就叫做持久化。

(2)日志持久化的两种方式:

①配置日志文件名

Properties配置:

logger.file.name:logger/springboot.log

Yml配置:

logging:

        file:

                name:logger/springboot.log

[两者任选其一即可]

②配置日志的存储目录

Properties配置:

logger.file.path:D:/temp

Yml配置:

logging:

        file:

           path:D:/temp

[两者任选其一即可]

(3)当logger.file.name与logger.file.path两个都配置的情况下,只生效其一,以logger.file.name为准

5.3划分日志文件大小

(1)如果我们的日志都放在一个文件中,随着项目的运行,日志文件会越来越大,需要对文件进行分割。【当然日志框架也考虑到了,如果不进行配置,默认就是10M进行分割

(2)配置日志文件的分割:

①Properties配置:

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

②yml配置:

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

(3)

logging.logback.rollingpolicy.file-name-pattern:日志分割后的文件名格式

logging.logback.rollingpolicy.max-file-size:日志文件超过这个大小就自动分割

5.4配置日志格式

(1)目前日志打印的格式是默认的,打印日志的格式,也是支持可配置的,支持控制台和日志文件分别设置。

(2)

logging.pattern.console:控制台日志格式

logging.pattern.file:日志文件的日志格式

①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'

(3)通常情况下我们使用默认的日志打印格式就足够了




6、简单化的日志输出

6.1添加lombok依赖

每次使用日志工厂创建日志对象时十分繁琐的,而且几乎每个类都需要添加一遍,lombok给我们提供了一种更简单的方式就是使用 @Slf4j 注解输出日志 

6.2使用注解@Slf4j输出日志

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

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

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

相关文章

ElementUI学习笔记

一、ElementUI概述 官网:https://element.eleme.cn/#/zh-CN (一)定义 Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。是基于Vue的一个UI框架,该框架基于Vue开发了很多相关组件&#xf…

Ubuntu如何创建一个子用户并赋与管理员权限

在Ubuntu操作系统中,如何创建一个子用户并赋与管理员权限 一、创建用户 sudo useradd -m -s /bin/bash test详细解释: sudo:以超级用户(root)权限执行该命令。useradd 命令通常需要管理员权限,因此需要加上 sudo。 useradd:创建新用户的命令。 -m:指示系统为新用户创建…

Java项目实战II基于Java+Spring Boot+MySQL的工程教育认证的计算机课程管理平台(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着工程教…

18 实战:基于Tkinter和OpenCV的视频编码器:实现MPEG4矩形帧编码器

引言 在视频处理领域,视频编码器的设计与实现一直是研究的热点。本文将深入解析一段基于Python的代码,该代码利用Tkinter、OpenCV和NumPy库构建了一个MPEG4矩形帧编码器的图形用户界面(GUI)。通过详尽的代码讲解,帮助读者全面理解视频编码的基本原理及其在实际应用中的实…

SmartX 在新能源:支撑多家头部企业 MES 等核心系统稳定运行与 VMware 替换

在过去几年中,中国新能源企业经历了迅猛的增长。随着电池技术、光伏发电和风电等领域的不断进步,新能源企业不仅面临生产能力的提升需求,还需要优化运营效率和管理复杂度,其基础设施建设则需要不断升级以适应这种快速扩展的需求&a…

ELK配置转存redis缓存,采集nginx访问日志

在136服务器上部署mysql 启动mysql服务 可通过以下命令查找安装的软件包 怎么查找安装软件的日志文件位置rpm -qc mysql-server,即可显示mysql.log位置 也可通过查找配置文件中的log关键字来查找log文件日志位置 用awk命令,以切割,输出第二个…

诱骗取电快充协议芯片,支持与其它 MCU 共用 D+D-网络和电脑传输数据

前言 在科技日新月异的今天,快充技术已成为智能手机、平板电脑乃至笔记本电脑等电子设备不可或缺的一部分。各大厂商为了提升用户体验,纷纷推出了自家的快充协议,这些协议不仅让充电速度大幅提升,还带来了更加智能、安全的充电体验…

ubuntu20.04 加固方案-设置用户缺省UMASK

一、编辑/etc/profile配置文件 打开终端。 查看当前umask 使用文本编辑器(如vim)编辑/etc/profile文件。 sudo vim /etc/profile 二、添加配置参数 在打开的配置文件的末尾中,添加或修改以下参数: umask 027 三、保存并退出…

高阶数据结构--图(graph)

图(graph) 1.并查集1. 并查集原理2. 并查集实现3. 并查集应用 2.图的基本概念3. 图的存储结构3.1 邻接矩阵3.2 邻接矩阵的代码实现3.3 邻接表3.4 邻接表的代码实现 4. 图的遍历4.1 图的广度优先遍历4.2 广度优先遍历的代码 1.并查集 1. 并查集原理 在一…

全渠道供应链打造中企业定制开发2+1链动模式S2B2C商城小程序的策略与影响

摘要:本文探讨了全渠道供应链打造对于零售企业的重要性及面临的挑战,着重分析了物流环节整合的难点,并以家电行业为例说明了节假日期间物流对企业经营的影响。同时,引入“企业定制开发21链动模式S2B2C商城小程序”这一关键因素&am…

Oracle视频基础1.3.3练习

1.3.3 检查数据库启动情况 ps -ef | grep oracle启动数据库 sqlplus /nolog conn / as sysdba修改 fast_start_mttr_target 参数为初始值-50,缺省 scope 和 sid,查看修改结果 show parameter fast; alter system set parameter 250; show parameter fa…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要:本文涵盖了GIS软件操作的多方面内容,包括地图文档的新建、打开、保存及版本兼容性处理;错误与警告的查阅及帮助文档的使用技巧;地图打印比例尺的调整与地图信息的完善;图层操作的撤销与恢复,界面元素的…

电商预售是时候“消亡”了

淘天反复横跳在预售里。 作者|周立青 编辑|杨舟 “明知道搞复杂的预售规则会给用户体验带来伤害,弊大于利,甚至内网就有很多人在骂在批评,还要在今年双11这么玩,算是见识到了公司的组织惯性和路径依赖是多么可怕”,淘…

关于游戏加加不可以在cs2中显示的解决方案

输入的代码如下 -allow_third_party_software 1.打开steam 右键cs2,打开属性。 然后再这里填上这个代码就可以了

Codeforces Global Round 27 D.Yet Another Real Number Problem

题目 题解&#xff1a; #include <bits/stdc.h> using namespace std; // #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 #define ll long long #define pii pair<int, i…

Spring Boot中解决BeanDefinitionStoreException问题的实战分享

目录 前言1. 问题背景2. 问题分析2.1 异常分析2.2 常见的错误原因2.3 排查过程 3. 解决方案3.1 清理缓存和重建项目3.1.1 清理IDEA缓存3.1.2 使用Maven清理并重建项目 3.2 升级Maven版本3.2.1 下载最新Maven版本3.2.2 IDEA配置新的Maven版本3.2.3 清理缓存并重新构建 3.3 验证问…

新160个crackme - 088-[KFC]fish‘s CrackMe

运行分析 需破解用户名和RegKey PE分析 C程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida函数窗口逐个查看&#xff0c;找到关键函数sub_401440 ida无法动调&#xff0c;需使用OD&#xff0c;启用StrongOD插件才可以动调ida静态分析&#xff0c;逻辑如下&…

淘宝/天猫获得淘宝商品评论 API 返回值说明

淘宝/天猫获得淘宝商品评论 API 返回值说明 item_review-获得淘宝商品评论API注册测试 taobao.item_review 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包…

Rust精简核心笔记:第三波,基础语法完结篇

今天是Rust精简核心笔记第三波&#xff0c;也是完结篇。之前已经介绍了二波&#xff0c;Rust精简核心笔记&#xff1a;第一波&#xff0c;深入浅出语法精华-CSDN博客&#xff0c;Rust精简核心笔记&#xff1a;第二波&#xff0c;语法精髓部分解锁-CSDN博客&#xff0c;通过三波…

如何找到车在路上行驶的视频素材

作为一名热爱拍摄视频的大学生&#xff0c;找到合适的车在路上行驶的视频素材是非常重要的。不论你是制作城市宣传片、汽车广告&#xff0c;还是交通相关的教学视频&#xff0c;高质量的视频素材都能显著提升作品的专业性。今天&#xff0c;我为大家推荐几个优秀的网站&#xf…