浅谈SpringBoot日志文件

文章目录

  • 一、日志的作用
  • 二、如何在SpringBoot中使用日志
    • 2.1、在程序中得到日志对象。
    • 2.2、通过日志对象中提供的内置方法操打印日志信息
      • 2.2.1 日志级别
        • 2.2.1.1、日志级别有什么作用??
        • 2.2.1.2、日志级别的分类
        • 2.2.1.2、在配置文件中设置日志级别[!]
  • 三、日志框架
  • 四、日志的持久化[!]
    • 4.1、配置文件中设置日志的保存路径
    • 4.2、配置文件中设置日志的文件名
  • 五、System.out.println vs 日志框架存在的缺点
  • 六、更简单的日志输出——lombok

一、日志的作用

1、排除和定位问题
2、记录用户登录日志, 方便分析用户是正常登录还是恶意破解用户。
3、记录系统的操作日志,方便数据恢复和定位操作人。
4、记录程序的执行时间,方便为以后优化程序提供数据支持。

二、如何在SpringBoot中使用日志

SpringBoot启动时,就有日志在控制台输出:
在这里插入图片描述
Spring启动输出日志信息,说明:
1、SpringBoot内置了日志框架。
2、默认情况下,输出的日志并非是开发者定义和打印的,那开发者怎么在程序中自定义打印日志呢??
3、日志信息默认打印在控制台上,但控制台的日志信息不能被保存,那怎么永久将日志信息保存下来??

那么程序员在SpringBoot中自定义打印日志需要:

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

LoggerFactory 来自 slf4j包,slf4j 就是SpringBoot中内置的日志框架。

private static Logger 1ogger = LoggerFactory. getLogger(UserController .class);

2.2、通过日志对象中提供的内置方法操打印日志信息

代码例子:

package com.example.testall.Controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** 程序员自己自定义打印日志*/
@Controller
@ResponseBody
@RequestMapping("/testlogger")  //一级路由
public class testLogger {
//    getLogger()的参数既可以是String又可以是类,参数表示的意思是:
//    当前的日志信息是来自哪个类。//    1、得到日志对象private static final Logger logger = LoggerFactory.getLogger(testLogger.class);@RequestMapping("/hi")  //二级路由public String hi(){//    2、通过日志对象中提供的内置方法操打印日志信息logger.trace("我是 trace!");logger.debug("我是调试日志!");logger.info("我是 info");logger.warn("我是 warn");logger.error("我是 error");return "Hi,SpringBoot!";}}

控制台运行结果:
在这里插入图片描述
在这里插入图片描述

但是为什么代码中写了5个日志打印,控制台却只输出打印3个日志信息??

2.2.1 日志级别

这与日志的级别有关! 日志进行打印时,只会打印当前设置的日志级别(SpringBoot默认的日志级别就是 info。)以及比当前日志级别更高的日志,低的日志就不打印了。[!]

就像工作中,你的领导可以给你安排工作,领导的领导同样也可以给你安排工作,因为对于你的领导来说,你的级别低,但是对于别的员工来说,你级别较高也是一个领导,此时级别比你低的员工就不能给你安排工作。

2.2.1.1、日志级别有什么作用??

1、通过日志级别能快速筛选出重要的信息,节省时间。 一般看控制台输出的日志信息时,不会全部日志级别都看,着重关注 warn(警告)、error(错误)这两个日志级别,也有可能只关注 error 日志。
2、不同环境实现不同日志级别设置的需求。可能开发环境下,需要着重关注详细信息,此时就需要很多日志打印的支持;而生产环境下为了保证性能与安全性,会尽量少的出现日志输出。

2.2.1.2、日志级别的分类

trace:微量、少许
debug:需调试时的关键信息打印
info:普通的打印信息(默认的日志级别)
warn:警告信息,不影响使用,但需要注意的问题
error:错误信息。级别较高
fatal:致命的,因为代码异常导致程序退出执行的事件(这个日志级别是没办法通过日志对象内置的方法来自定义输出的,因为这个日志级别对于程序来说是致命的,只有程序由于异常而退出时,才会由系统输出)

级别从小到大:
trace < debug < info < warn < error。
在这里插入图片描述

2.2.1.2、在配置文件中设置日志级别[!]

在这里插入图片描述
此时就将SpringBoot框架里的默认日志级别从 info 改成了 debug。还是之前的代码,此时程序运行结果多了打印 debug 日志!
在这里插入图片描述

当我们的项目中含有许多不同层级时,希望这些层级输出的日志级别都不一样,此时也可以通过配置文件按配置。
在这里插入图片描述
此时就可以在配置文件中给3个层级设置不同日志级别来让控制台输出不同的日志信息。
在这里插入图片描述

三、日志框架

SpringBoot引入了哪些日志框架??为什么能把日志打印出来??
在这里插入图片描述

四、日志的持久化[!]

我们现在所见到的日志信息都是打印在控制台的,但是控制台输出的信息并不会持久的保存,因此我们需要对日志进行持久化,确保日志能够永久、持久的保存、并且方便查看。

持久化的方式无非两种:1、存进数据库 2、保存进磁盘。

日志的持久化是保存在磁盘上,那么有两种方式保存在磁盘上:

4.1、配置文件中设置日志的保存路径

此时SpringBoot就会将你项目中所有输出到控制台的日志信息保存到你所设置的保存路径里。
在这里插入图片描述
我是先在D盘下建立名为mylogs的目录,然后在项目的配置文件中设置日志的配置项,此时项目启动之后,Spring就会在目录mylogs下生成spring.log文件,将项目输出的日志信息保存到该文件中。
在这里插入图片描述
日志信息持久化保存在文件里时,其内容是追加的,不会覆盖!
当设定的保存日志信息的文件保存了很多日志信息以至于文件量变大,导致每次打开日志文件就很困难时,SpringBoot是会设定一个文件保存最大值,当我们设定的文件里的日志信息达到该值后,SpringBoot就会新建一个文件保存日志信息。

4.2、配置文件中设置日志的文件名

在这里插入图片描述

五、System.out.println vs 日志框架存在的缺点

1、System.out.println 打印信息不全,缺少输出时间、打印来源…
2、不能实现像日志框架那样的隐藏和显示
3、System.out.println 打印的日志信息不能持久化

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

使用 lombok 提供的 注解 @slf4j,
注解 @slf4j 等于代码:private static Logger 1ogger = LoggerFactory. getLogger(UserController .class); , 方法里的类参数也不需要我们传入了,注解全部帮我们做好了。

此时就提供了一个log对象,通过此log对象使用日志框架里内置的方法输出日志信息。
在这里插入图片描述

使用lombok后,lombok为我们节省了一些代码的书写,只需要添加一个注解就好了,那么它的原理是什么?
在这里插入图片描述

lombok的常用注解:
在这里插入图片描述

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

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

相关文章

Linux线程:线程分离

目录 一、什么是线程分离 1.1pthread_detach 1.2pthread线程库存在的意义 1.3__thread线程的局部存储 1.4系统调用clone 一、什么是线程分离 1.1pthread_detach 默认情况下&#xff0c;新创建的线程是joinable的&#xff0c;线程退出后&#xff0c;需要对其进行pthread_joi…

非对称密钥:应用场景

public class EncryptionAndSignatureExample { public static void main(String[] args) throws Exception {// 生成公私钥对KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(1024);KeyPair keyPair keyPai…

路由策略实验2

对R7&#xff0c;重发布直连路由 对R2&#xff0c;做双向 对R3同样 先不改优先级 查看&#xff0c;知道所有给R3的路由为151&#xff0c;全部为OSPF。 知道了是错误的&#xff0c;先把3&#xff0c;4之间的线路断掉 接着对R3&#xff0c;让优先级全部回到100&#xff08;displa…

node-sass和sass-loader安装Error经验

一、问题 当前笔记本环境版本&#xff1a;node-v16.15.1&#xff1b;npm-8.11.0&#xff0c;在面对五年前vue项目的依赖sass-loader8.0.2&#xff0c;node-sass4.14.1的情况下&#xff0c;怎么参考大神们的安装教程&#xff0c;始终存在Error&#xff0c;经过坚持不懈的努力&a…

微软云计算之云计算平台、云操作系统Windows Azure

微软云计算平台 微软云计算平台微软的云计算技术Windows Azure组成 微软云操作系统Windows AzureWindows Azure概述Windows Azure计算服务Windows Azure存储服务全局命名空间体系架构存储域的层次结构双复制引擎文件流层分区层 Windows Azure ConnectWindows Azure CDNFabric控…

十_信号11 - 函数sigsetjmp() 和 siglongjmp()

也就是说&#xff0c;正常情况下&#xff0c;当捕捉到一个信号&#xff0c;并调用该信号的信号处理程序时&#xff0c;被捕捉的信号会被加入到当前进程的信号屏蔽字中&#xff0c;以防止在本次信号处理程序还没有完成的时候&#xff0c;再次触发该信号&#xff0c; 发生重入。 …

LLaMA-Factory实战推理

LLaMA-Factory官网&#xff1a;https://github.com/hiyouga/LLaMA-Factory 安装环境 git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory/ conda create -n py310 python3.10 conda activate py310按照llama-factory要求的标准格式组织数据集&#xff…

网络原理——http/https ---http(2)

http(接上一篇文章) 认识请求报头"header" header里面的键值对,都是标准规定的内容,很多,我们主要是认识一些关键的 host 表示对应的服务器主机的IP / 域名 实际上,这两个通常来说是一样的 但是有些时候不一样 当我们通过代码构造http请求,url里面写的以Ip地址的…

6月2(信息差)

&#x1f30d;特斯拉&#xff1a;Model3高性能版预计6月中旬开启首批交付 &#x1f384;微软对开源字体 Cascadia Code 进行重大更新 ✨天猫618加码引爆消费热潮 截至晚9点185个品牌成交破亿 1.瑞士清洁科技公司Librec开发废旧锂离子电池回收技术&#xff0c;可回收电池90%的…

贴片和直插型IRM红外遥控接收头引脚定义和规格参数及使用注意事项

红外遥控接收头使用注意事项 引脚定义存在不同 红外遥控接收头大量使用在家用电器的遥控中&#xff0c;属于价廉物美的一种光电接收器件&#xff0c;批量价格约0.3元左右。 多数遥控接收头的引脚定义是OUT,GND,VCC&#xff0c;另有引脚定义不同为OUT,VCC,GND&#xff0c;记住…

Django 创建项目及应用

1&#xff0c;安装 Django pip install Django3.1.5 2&#xff0c;创建 Django项目 django-admin startproject myshop 3&#xff0c;创建 Django应用 python manage.py startapp app1 4&#xff0c;启动 Django项目 python .\manage.py runserver 到这里项目及应用创建…

空间转录组基础数据解读+学习方法

详情请参考这个视频&#xff1a;空间转录组&#xff08;spatial transcriptome&#xff09;数据分析基础教程_哔哩哔哩_bilibili 1.首先是filtered_feature_bc_matrix文件 两个里面的内容本质一样&#xff0c;都是空间转录组 表达矩阵的信息 2.具体的所有东西可以在10x的网站…

React(五)UseEffect、UseRef

(一)useEffect useEffect – React 中文文档 useEffect hook用于模拟以前的class组件的生命周期&#xff0c;但比原本的生命周期有着更强大的功能 1.类组件的生命周期 在类组件编程时&#xff0c;网络请求&#xff0c;订阅等操作都是在生命周期中完成 import React, { Co…

图书推荐:ChatGPT专业知识信息课程

《ChatGPT专业知识信息课程》&#xff08;ChatGPT-Expertise Informative Course&#xff09; 是一本由Dwayne Anderson撰写的电子书&#xff0c;提供了关于ChatGPT的丰富知识。该书涵盖了与ChatGPT相关的各种主题&#xff0c;如其与OpenAI的关系、ChatGPT与GPT-3之间的混淆、C…

【蓝牙概述】

蓝牙无线技术是一种短距离通信系统&#xff0c;旨在取代连接便携式和/或固定电子设备的电缆。蓝牙无线技术的主要特点是稳健性、低功耗和低成本。该规范的许多功能都是可选的&#xff0c;从而允许产品差异化。 蓝牙无线技术系统有两种形式&#xff1a;基本速率 (BR) 和低功耗 …

浅谈旧项目如何添加新依赖

Spring项目创建之后&#xff0c;还想添加新的依赖&#xff08;如Spring框架内置的依赖&#xff09;&#xff0c;可以安装插件&#xff1a; 装完该插件之后&#xff0c;就可以在pom.xml文件里&#xff0c;右键选择 Generate即可出现下述界面&#xff1a; 点击ok即可添加新的…

jpeg压缩算法学习(1)——离散余弦变换

离散余弦变换是jpeg压缩算法的关键步骤 思想 离散余弦变换的基本原理是&#xff1a;每一组离散的数据都可以由一组不同频率的余弦波来表示。 应用于图片上就是&#xff1a;将像素值转换为不同频率的余弦函数的系数&#xff08;权重&#xff09; 像素值——>权重 一维离…

网络原理——TCP/IP--数据链路层,DNS

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 目录 数量链路层目的地址和原地址类型校验和 DNS 数量链路层 主要的协议是以太网协议.一个横跨数据链路层和 物理层的协议,既包含了数据链路层的内容, 也包含了⼀些物理层的内容 我们来了解一…

【前端开发--css学习笔记】CSS超详细的学习笔记。前端开发css学习笔记(非常详细,适合小白入门)

二&#xff0c;CSS学习笔记 1&#xff0c;CSS语法 1-1 CSS 实例 CSS声明总是以分号 ; 结束&#xff0c;声明总以大括号 {} 括起来: <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title…

为什么改变进制传输系统码长不变

目录 直接上图片 问题分析 传信率与传码率 多进制调制 码长不变的理解 误码率考量 总结 直接上图片 问题分析 在讨论这个问题时&#xff0c;通常是指在保持RB&#xff08;码元传输速率&#xff0c;传码率&#xff0c;符号率&#xff0c;波特率&#xff09;不变的情况下&a…