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

程序员必会技能—— 使用日志

目录

1、为什么要使用日志

 2、自定义日志打印

2.1、在程序中得到日志对象

 2.2、使用日志对象打印日志

 2.3、日志格式

3、日志的级别

3.1、日志级别的分类

3.2、日志级别的设置

4、持久化日志

 5、更简单的日志输出——lombok

5.1、如何在已经创建好的SpringBoot项目中添加依赖 

5.2、代码变化:

 5.3、lombok原理解释


1、为什么要使用日志

  • 能够发现和定位问题
  • 能够记录用户登录日志,便与分析用户是正常登录还是恶意破解用户
  • 能够记录系统的操作日志,方便数据恢复和定位操作人
  • 记录程序的执行时间,方便为以后优化程序提供数据支持

例如SpringBoot项目启动时,输出的控制台日志信息:


 2、自定义日志打印

步骤:

  • 在程序中得到日志对象
  • 使用日志对象的相关语法输出要打印的内容

2.1、在程序中得到日志对象

//1、得到日志对象
private static Logger logger = LoggerFactory.getLogger(ControllerTest.class);

 注:Logger对象是属于org.slf4j包下

因为SpringBoot中内置了日志框架slf4j,所以咱们直接在程序中调用slf4j来输出日志

怎么理解这个问题呢?

        也就是说,日志的实现是会有很多种方式,而开发者们掌握的技能可能并不统一,就会造成,每个程序员都是用不同的方式去实现日志,当一个程序员离职后,另一个程序员想要修改一些日志输出格式等之类的东西,就会很麻烦,所以日志的门面就在这里起作用了,成功做到了解耦,开发者就只需要负责调用对接slf4j,而不需要关注日志是如何实现的了

 2.2、使用日志对象打印日志

package com.example.demo;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-03-13* Time:15:40*/
@RestController
@RequestMapping("/test")
public class ControllerTest {//1、得到日志对象private static Logger logger = LoggerFactory.getLogger(ControllerTest.class);@RequestMapping("/hi")public String sayHi() {//写日志logger.trace("日志:trace");logger.debug("日志:debug");logger.info("日志:info");logger.warn("日志:warn");logger.error("日志:error");return "日志打印";}}

        将项目启动后,在url输入对应的地址,访问后,回到IDEA,就会看到自己定义的日志了~

        为了可以看清楚,咱可以把Spring Boot项目启动时打印的日志删除掉:

访问:

 

日志:

 

 2.3、日志格式

日志归属,也可能是缩写,如: 

前面两个缩写~ 

        有小伙伴可能看到,打印的日志并不全,明明写五个,只打印了3个,为什么?这里就会引出日志的级别啦~


3、日志的级别

3.1、日志级别的分类

  • trace:微量,少许,级别最低
  • debug:需要调试时候的关键信息打印
  • info:普通的打印信息(默认日志的级别)
  • warn:警告,不影响使用,但需要注意的问题
  • error:错误信息,级别较高的错误日志信息
  • fatal:致命的,因为代码异常导致程序退出执行的事件

日志级别的顺序:

越往上接收到的消息越少,如设置了warn就只能收到warn、error、fatal级别的日志了

3.2、日志级别的设置

日志级别配置在配置文件中配置:


logging:level:root: error

4、持久化日志

        为什么要持久化日志,因为上述的日志都是输出在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便后续出现问题追溯问题,将日志保存下来的过程就叫做持久化

        将日志保存下来,只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名之后,SpringBoot就会将控制台的日志写到相应的目录或文件下了~

配置日志文件的保存路径:

logging:file:path: D:\\CCL\\rizhi

 配置文件的文件名:

logging:file:path: D:\\CCL\\rizhi\\spring0313.log

 重新启动代码,访问对应网页,然后去查看对应文件夹:

我这的重复是因为我刚才不小心,将页面刷新了好几遍 ~


 5、更简单的日志输出——lombok

每次创建一个新的类,需要的打印日志信息时,都需要:

//1、得到日志对象private static Logger logger = LoggerFactory.getLogger(xxxx.class);

稍显繁琐,因此使用lombok来更简单的输出:

  1. 添加lombok框架支持
  2. 使用@slf4j注解输出日志

5.1、如何在已经创建好的SpringBoot项目中添加依赖 

        如果,一开始创建项目时,没有添加lombok依赖,则需要添加lombok依赖,在已经创建好的SpringBoot项目中添加依赖,需要借助插件

 然后将页面跳转到pom.xml上,右击:

 

 

 

然后就可以啦~ 

5.2、代码变化:

 5.3、lombok原理解释

我们查看target目录【target为项目最终执行的代码】:

 没有对应的slf4j注释了,而变成了最原来的创建日志对象的操作~

ps:如果有同学没有target这个目录,如下操作:

 把这个勾上即可~

好啦,本期到这里就结束咯~下期见~

相关文章:

程序员必会技能—— 使用日志

目录 1、为什么要使用日志 2、自定义日志打印 2.1、在程序中得到日志对象 2.2、使用日志对象打印日志 2.3、日志格式 3、日志的级别 3.1、日志级别的分类 3.2、日志级别的设置 4、持久化日志 5、更简单的日志输出——lombok 5.1、如何在已经创建好的SpringBoot项目中添加…...

生成项目的包依赖文件requirements.txt

目录生成项目的包依赖文件requirements.txtrequirements.txt文件怎么来?使用pipreqs第三方库requirements.txt文件使用requirements.txt生成项目的包依赖文件requirements.txt 在安装部署代码时或者使用别人的项目时,会需要安装项目的依赖包&#xff0c…...

安卓渐变的背景框实现

安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合,这是最推荐的方法,也是最有效的。2.利用canvas裁剪实现,这个方法有个缺陷,就是圆角会出现毛边,也就是锯齿。3.利用layer绘制边框1.背景 万…...

【拳打蓝桥杯】算法前置课——时间复杂度与空间复杂度

文章目录前言为什么需要复杂度分析?大O复杂度表示法时间复杂度分析几种常见时间复杂度实例分析空间复杂度分析内容小结最后说一句🐱‍🐉作者简介:大家好,我是黑洞晓威,一名大二学生,希望和大家一…...

vite中动态引入图片,打包之后找不到图片地址?

一般来说项目中我们集中存放图片,然后希望在页面中直接引入! 更好的就是直接在模板中调用一个函数 然后传入图片的名字就可以显示出来 事实上确实可以办到,我们用到了一个 new URL import.meta.url这俩个东西 再src目录下 static 下创建一…...

Docker 常用命令大全

目录 一、Docker (一)Docker基础命令 (二)docker镜像命令 (三)docker容器命令 (四)docker运维命令​​​​​​​ 一、Docker 容器是一种虚拟化技术,容器是镜像实例…...

React项目规范:目录结构、根目录别名、CSS重置、路由、redux、二次封装axios

React项目(一)一、创建项目二、目录结构三、craco配置别名并安装less1.craco安装2.配置别名3.安装less四、CSS样式重置五、配置路由六、配置Redux1.创建大仓库2.创建小仓库(1)方式1:RTK(2)方式2…...

SystemVerilog 教程第一章:简介

SystemVerilog 教程像 Verilog 和 VHDL 之类的硬件描述语言 (HDL) 主要用于描述硬件行为,以便将其转换为由组合门电路和时序元件组成的数字块。为了验证 HDL 中的硬件描述正确无误,就需要具有更多功能特性的面向对象的编程语言 (OOP) 来支持复杂的测试过…...

【Java|基础篇】逻辑控制-顺序结构、分支结构和循环结构

文章目录顺序结构分支结构if单分支语句if else双分支语句if else if else多分支语句switch语句循环语句for循环while循环do while循环continuebreak总结顺序结构 顺序结构是指代码按照从上往下的顺序依次执行 分支结构 选择语句是条件成立时,才会执行的语句.共有三种.分为是if…...

【数据挖掘实战】——家用电器用户行为分析及事件识别(BP神经网络)

项目地址:Datamining_project: 数据挖掘实战项目代码 目录 一、背景和挖掘目标 1、问题背景 2、原始数据 3、挖掘目标 二、分析方法与过程 1、初步分析 2、总体流程 第一步:数据抽取 第二步:探索分析 第三步:数据的预处…...

Kmeans聚类算法-python

import random import pandas as pd import numpy as np import matplotlib.pyplot as plt # 计算欧拉距离 def calcDis(dataSet, centroids, k): clalist[] for data in dataSet: diff np.tile(data, (k, 1)) - centroids #相减 (np.tile(a,(2,1))就是把…...

Linux|奇怪的知识|locate命令---文件管理小工具

前言: Linux的命令是非常多的,有一些冷门的命令,虽然很少用,但可能会有意想不到的功能,例如,本文将要介绍的locate命令。 (平常很少会想到使用此命令,find命令使用的更多,偶然想起…...

Cadence Allegro 导出Function Pin Report报告详解

⏪《上一篇》   🏡《上级目录》   ⏩《下一篇》 目录 1,概述2,Function Pin Reportt作用3,Function Pin Report示例4,Function Pin Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频 1,概述...

蓝桥杯2018年第九题-缩位求和

题目:在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。比如:248 * 15 3720把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是1位数,得2 4 8 14 > 1 4 5;1 5 65…...

基于Yolv5s的口罩检测

1.Yolov5算法原理和网络结构 YOLOv5按照网络深度和网络宽度的大小,可以分为YO-LOv5s、YOLOv5m、YOLOv5l、YOLOv5x。本文使用YOLOv5s,它的网络结构最为小巧,同时图像推理速度最快达0.007s。YO-LOv5的网络结构主要由四部分组成,分别…...

Linux基本命令

Linux基本命令Linux的目录结构Linux命令入门目录切换相关命令(cd/pwd)相对路径、绝对路径和特殊路径符创建目录命令(mkdir)文件操作命令part1 (touch、cat、more)文件操作命令part2 (cp、mv、rm)查找命令 (which、find…...

云原生场景下的安全左移

本博客地址:https://security.blog.csdn.net/article/details/129430859 一、安全左移概述 安全左移需要考虑开发安全、软件供应链安全、镜像仓库、配置核查这四个部分。 首先是开发安全,安全团队需要关注代码漏洞,比如使用代码检查工具进…...

mysql面试经典问题

文章目录 1. 能说下myisam 和 innodb的区别吗?2. 说下mysql的索引有哪些吧,聚簇和非聚簇索引又是什么?3. 那你知道什么是覆盖索引和回表吗?4. 锁的类型有哪些呢5. 你能说下事务的基本特性和隔离级别吗?6. 那ACID靠什么保证的呢?7. 那你说说什么是幻读,什么是MVCC?幻读什…...

微信小程序|基于小程序+C#制作一个考试答题小程序

基于小程序+C#制作一个考试答题小程序打破传统线下考试答题的边界线问题,使考试不用再局限与某个统一的场所,只要有设备,哪里都能考试。 一、小程序...

【1605. 给定行和列的和求可行矩阵】

来源:力扣(LeetCode) 描述: 给你两个非负整数数组 rowSum 和 colSum ,其中 rowSum[i] 是二维矩阵中第 i 行元素的和, colSum[j] 是第 j 列元素的和。换言之你不知道矩阵里的每个元素,但是你知…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

【HTTP三个基础问题】

面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

【生成模型】视频生成论文调研

工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

git: early EOF

macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...