Spring Boot的日志

在这里插入图片描述

打印日志

打印日志的步骤:
• 在程序中得到日志对象.
• 使用日志对象输出要打印的内容

在程序中得到日志对象

在程序中获取日志对象需要使用日志工厂LoggerFactory,代码如下:

package com.example.demo;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LoggerController {private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
}

LoggerFactory.getLogger需要传递一个参数,用于标识该日志的出处,这样就可以清晰的看出该日志是哪个类输出的日志,方便观察调试,定位问题
这里需要注意的是:
Logger和LoggerFactory这两个类是属于org.slf4j包下的

使用日志对象输出要打印的内容

日志对象的打印级别有很多种,这里先打印info级别的日志:

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;@RestController
@RequestMapping("/logger")
public class LoggerController {private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@RequestMapping("/printLogger")public String printLogger(){logger.info("我是info级别的日志");return "打印日志";}
}

在这里插入图片描述

在这里插入图片描述

门面模式

真假日志框架

前面我们创建日志对象,导入了slf4j的包,因此,我们需要对slf4j进行深入的学习,要了解slf4j,就得先了解门面模式
门面模式提供了一个统一的接口,用于调用子系统中的一群子接口,并对子系统的接口提供了一套规范,标准,接口.所有SLF4J并不能独立使用,需要和具体的日志框架配合使用
在这里插入图片描述

slf4j就是这样一个门面系统,因为它本身并不是一个真正的日志实现,而只是一个抽象层,对真正的日志框架提供了规范.
常见的真正的日志框架有log4j,logback

存在即合理

既然有真正的日志框架,那么为什么需要门面模式的存在?
在不引入门面模式的时候
当一个项目已经试用了log4j,假如出现一种情况,需要把logback也引入进去,那么就会引出以下问题:

  1. 不同日志框架的API接口和配置文件不同,如果多个日志框架共存,那么不得不维护多套配置文件(这 个配置文件是指用户自定义的配置文件).
  2. 如果要更换日志框架,应用程序将不得不修改代码,并且修改过程中可能会存在一些代码冲突.
  3. 如果引入的第三方框架,使用了多套,那就不得不维护多套配置 这时我们将门面模式引入,引入门面日志框架之后,应用程序和日志框架(框架的具体实现)之间有了统⼀的API接口(门面日志框架实现),此时应用程序只需要维护⼀套日志文件配置,且当底层实现框架改变时,也不需要更改应用程序代码.

门面模式的优点

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

日志格式的说明

打印的日志分别代表什么呢?
在这里插入图片描述
从上图可以看到,日志输出内容元素具体如下:

  1. 时间日期:精确到毫秒
  2. 日志级别:ERROR,WARN,INFO,DEBUG或TRACE
  3. 进程ID
  4. 线程名
  5. Logger名(通常使用源代码的类名)
  6. 日志内容

日志级别

日志级别的分类

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

日志级别的使用

        logger.trace("================= trace ===============");logger.debug("================= debug ===============");logger.info("================= info ===============");logger.warn("================= warn ===============");logger.error("================= error ===============");return "打印不同日志";

SpringBoot默认的日志框架是Logback,Logback没有 FATAL 级别,它被映射到ERROR .
出现fatal日志,表示服务已经出现了某种程度的不可用,需要需要系统管理员紧急介入处理.通常情况下,一个进程生命周期中应该最多只有一次FATAL记录.
在这里插入图片描述
在这里插入图片描述
结果发现,只打印了info,warn和error级别的日志
这与日志级别的配置有关,日志的输出级别默认是info级别,所以只会打印大于等于此级别的日志,也就是info,warn和error.

日志配置

properties配置:

logging.level.root: debug

yml配置:

logging:level:root: debug

重新运行,就可以得到下面结果
在这里插入图片描述

日志持久化

以上的日志都是输出在控制台上的,然而在线上环境中,我们需要把日志保存下来,以便出现问题之后追溯问题.把日志保存下来就叫持久化.
日志持久化有两种方式:
1.配置日志文件名

logging.file.name= logger.log
logging:file:name: logger.log

运行结果显示,日志内容保存在了对应的目录下
在这里插入图片描述

2.配置日志的存储目录

logging.file.path: D:/temp
logging:file:path: D:/temp

运行程序,日志就会被保存到设置的磁盘目录下,但是这种方式只能设置日志的路径,文件名固定为spring.log
在这里插入图片描述
注意:
logging.file.name 和 logging.file.path 两个都配置的情况下,只生效其⼀,以
logging.file.name 为准

配置日志文件分割

如果我们的日志都放在⼀个文件中,随着项目的运行,日志文件会越来越大,需要对日志文件进行分割,当然,如果我们不对它进行配置,系统就会让它走默认配置,即超过10MB就进行分割

配置项说明默认值
logging.logback.rollingpolicy.file-name-pattern⽇志分割后的⽂件名格式${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.max-file-size日志文件超过这个大小就自动分割10MB
Properties配置:
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i
logging.logback.rollingpolicy.max-file-size=1KB

yml配置:

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

运行项目,多打印一些日志,得到以下结果:
在这里插入图片描述

更简单的日志输出

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

添加lombok依赖

        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

日志输出

lombok提供的 @Slf4j 会帮我们提供⼀个日志对象log,我们直接使用就可以

package com.example.demo;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("/info")public void log(){log.info("info");}
}

在这里插入图片描述

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

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

相关文章

安装you-get(mac)

1、首先要有python环境 2、更新pip python -m pip install --upgrade pip 3、安装you-get pip install you-get;

T天池SQL训练营(五)-窗口函数等

–天池龙珠计划SQL训练营 5.1窗口函数 5.1.1窗口函数概念及基本的使用方法 窗口函数也称为OLAP函数。OLAP 是OnLine AnalyticalProcessing 的简称&#xff0c;意思是对数据库数据进行实时分析处理。 为了便于理解&#xff0c;称之为窗口函数。常规的SELECT语句都是对整张表进…

创建vue项目:node.js下载安装、配置环境变量,下载安装cnpm,配置npm的目录、镜像,安装vue、搭建vue项目开发环境(保姆级教程一)

今天讲解 Windows 如何创建 vue 项目&#xff0c;搭建 vue 开发环境&#xff0c;这是这个系列的第一章&#xff0c;有什么问题请留言&#xff0c;请点赞收藏&#xff01;&#xff01;&#xff01; 文章目录 一、Vue简单介绍二、开始搭建1、安装node.js环境2、配置npm下载时的默…

一文3000字从0到1用Python进行gRPC接口测试!

gRPC 是一个高性能、通用的开源RPC框架&#xff0c;其由 Google 主要面向移动应用开发并基于HTTP/2 协议标准而设计&#xff0c;基于 ProtoBuf(Protocol Buffers) 序列化协议开发&#xff0c;且支持众多开发语言。 自gRPC推出以来&#xff0c;已经广泛应用于各种服务之中。在测…

数据可视化免费化的双面影响探析

近年来数据可视化的免费化也越来越明显&#xff0c;今天就以我作为可视化设计师的经验来和大家分析一下&#xff0c;数据可视化工具免费化所带来的利与弊。 先从好处入手&#xff0c;最明显的就是免费化可以让数据可视化工具得到更广泛的使用。 免费数据可视化工具使得更多人可…

docker搭建nginx实现负载均衡

docker搭建nginx实现负载均衡 安装nginx 查询安装 [rootlocalhost ~]# docker search nginx [rootlocalhost ~]# docker pull nginx准备 创建一个空的nginx文件夹里面在创建一个nginx.conf文件和conf.d文件夹 运行映射之前创建的文件夹 端口&#xff1a;8075映射80 docker…

电脑版便签软件怎么设置在桌面上显示?

对于不少上班族来说&#xff0c;如果想要在使用电脑办公的时候&#xff0c;随手记录一些常用的工作资料、工作注意事项等内容&#xff0c;直接在电脑上使用便签软件记录是比较方便的。电脑桌面便签工具不仅方便我们随时记录各类工作事项&#xff0c;而且支持我们快速便捷使用这…

长城之上的无人机:文化遗产的守护者

长城之上的无人机&#xff1a;文化遗产的守护者 在八达岭长城景区&#xff0c;两架无人机分别部署在了长城的南、北楼两点。根据当前的保护焦点和需求&#xff0c;制定了5条无人机综合巡查航线&#xff0c;以确保长城景区的所有开放区域都能得到有效监管。每天&#xff0c;无人…

Elasticsearch 8.9 flush刷新缓存中的数据到磁盘源码

一、相关API的handler1、接收HTTP请求的hander2、每一个数据节点(node)执行分片刷新的action是TransportShardFlushAction 二、对indexShard执行刷新请求1、首先获取读锁&#xff0c;再获取刷新锁&#xff0c;如果获取不到根据参数决定是否直接返回还是等待2、在刷新之后transl…

Java的三种代理模式实现

代理模式的定义&#xff1a; Provide a surrogate or placeholder for another object to control access to it.&#xff08;为其他对象提供一种代理以控制对这个对象的访问。&#xff09; 简单说&#xff0c;就是设置一个中间代理来控制访问原目标对象&#xff0c;达到增强原…

ProEasy机器人案例:电池边包胶

如下图所示&#xff0c;对一个电池三边包边&#xff0c;因客户现场有很多规格电池的大小&#xff0c;所以就需要建立动态的工具坐标来实现适配所有种类的电池 程序如下&#xff1a;Ddome程序 function Speed(num) --速度设置 MaxSpdL(2000) --movl最大速度…

茄子科技张韶全:跨多云大数据平台DataCake在OceanBase的实践

11 月 16 日&#xff0c;OceanBase 在北京顺利举办 2023 年度发布会&#xff0c;正式宣布&#xff1a;将持续践行“一体化”产品战略&#xff0c;为关键业务负载打造一体化数据库。其中&#xff0c;在“数字化转型升级实践专场”&#xff0c;我们有幸邀请到了茄子科技大数据技术…

数据库:JDBC编程

专栏目录 MySQL基本操作-CSDN博客 MySQL基本操作-CSDN博客 数据库的增删查改&#xff08;CRUD&#xff09;基础版-CSDN博客 数据库增删改查&#xff08;CRUD&#xff09;进阶版-CSDN博客 数据库的索引-CSDN博客 基本概念 JDBC编程就是通过Java代码来操作数据库 api 数据库是…

Apache+mod_jk模块代理Tomcat容器

一、背景介绍 最近在看Tomcat运行架构原理, 正好遇到了AJP协议(Apache JServ Protocol). 顺道来研究下这个AJP协议和具体使用方法. 百度百科是这么描述AJP协议的: AJP&#xff08;Apache JServ Protocol&#xff09;是定向包协议。因为性能原因&#xff0c;使用二进制格式来传输…

postcss-pxtorem实现页面自适应的原理

先声明一点这玩意本身不能实现哈&#xff0c;他只是一个工具&#xff0c;更是一个postcss的插件 帮助我们从px转化成为rem比如我们的代码 div {height: 100px;width: 100px; }经过这个插件转化之后变成 假设变成下面这样哈 div {height: 1rem;width: 1rem; }其他没啥子太大作…

2023年江西省“振兴杯”网络信息行业职业技能竞赛 Web4 Writeup

这次振兴杯碰到的一道题&#xff0c;某些姿势之前貌似没有碰过&#xff0c;简单记一下吧 源码 <?php class Bird{public $funcs;public $salt;public $flag;function say_flag(){$secret hash_hmac(sha256, $_GET[salt], file_get_contents(/flag));$hmac hash_hmac(sha…

企业软件的分类有哪些|app小程序定制开发

企业软件的分类有哪些|app小程序定制开发 企业软件是指为了满足企业运营和管理需求而开发的软件系统。根据不同的功能和应用领域&#xff0c;企业软件可以分为以下几个分类&#xff1a; 1. 企业资源计划&#xff08;Enterprise Resource Planning&#xff0c;ERP&#xff09;软…

【UE5】瞬移+马赛克过渡效果

效果 步骤 1. 新建一个工程&#xff0c;创建一个Basic关卡 2. 添加第三人称游戏资源到内容浏览器 3. 新建一个材质&#xff0c;这里命名为“M_Pixel” 打开“M_Pixel”&#xff0c;设置材质域为“后期处理” 在材质图表中添加如下节点 此时效果如下&#xff0c;已经有马赛克的…

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用语法详解

文章目录 1️⃣ TypeScript常用讲解1.1 使用1.2 字符串1.3 数字1.3 布尔1.4 数组1.5 元组1.6 枚举1.7 any1.8 void1.9 object1.10 函数指定返回值的类型1.11 联合类型1.12 类型断言1.13 接口1.14 函数类型1.15 类类型1.16 泛型 2️⃣ 类2.1 类的基本写法2.2 类的继承2.3 类的修…

【算法集训】基础数据结构:三、链表

链表就是将所有数据都用一个链子串起来&#xff0c;其中链表也有多种形式&#xff0c;包含单向链表、双向链表等&#xff1b; 现在毕竟还是基础阶段&#xff0c;就先学习单链表吧&#xff1b; 链表用头结点head表示一整个链表&#xff0c;每个链表的节点包含当前节点的值val和下…