04--SpringBoot热部署与日志

1、热部署

1.1 引言

为了进一步提高开发效率,SpringBoot为我们提供了全部项目热部署,日后在开发过程中修改了部分代码或者相关配置文件之后,不需要再重启服务使其生效。在项目中开启了全局热部署之后,只需要在修改之后等待几秒钟就可使修改生效。

1.2 开启热部署

1.2.1 引入依赖

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <optional>true</optional>
 </dependency>

1.2.2 设置IDEA中的配置

  • 在设置中进行如下配置的勾选(File->Settings->Compiler->Build Project automatically)
    设置1

  • (2022.2.1版idea)在File->Settings->Advanced Settings中找到并勾选
    Allow auto-make to start even…
    设置2

  • 旧版idea直接快捷键:Ctrl + Shift + Alt + / ,选择Registry,再找到并勾选compiler.automake.allow.when.app.running

2、日志体系

2.1 日志框架发展史

  • 一开始,日志信息是为了去追踪一些异常信息,但早期只能去catch块中使用sout来实现,这种方式效率很低下且不方便,后来使用logUtil的工具来记录文本到文件中。慢慢的也出现了以下几点问题:
    • 随着用户量越来越多,记录在文本中的日志信息越来越多,单个文件越来越大;
    • 用户出现异常信息的时候,能不能发邮件来通知;
    • 能不能记录日志的时候按等级来区分;
    • 能不能IO异步,自由的控制格式;
  • 紧接着,开源的log4j诞生了,受到了广大开发者的欢迎。后来,它被Apache基金会收纳。
  • 后来,JDK官方sun也开发出了一个日志框架 JUL(java.utl.logging),并推出了日志门面JCL(jakarta Commons Logging),它不能实现日志功能,只支持整合日志;
  • 再后来,又出现了Slf4j的日志门面,它只整合日志而不实现具体的日志功能,需要通过适配器和桥接器来完成;
    • 模块1 官方(JCL门面) JUL日志框架 ------(适配器)---->>> 模块2 开源(SLF4J)------(桥接器)–>> 实现log4j的功能

2.2 代码层面的发展史

  • 早期,在日志中使用Apache的log4j框架来输出日志信息:
	import org.apache.log4j.Logger;
	
	Logger logger = Logger.getLogger(Test.class);
	logger.trace("trace");
  • 接着,JDK官方Sun公司出于对log4j的嫉妒,提出了JUL(java.util.logging)日志框架对抗log4j。如果需要将log4j的框架改为使用JUL,就只能一行一行的修改日志代码。
	import java.util.logging.LoggerLogger loggger = Logger.getLogger(Test.class.getName()); 
	logger.finest("finest");
  • 为了解决日志框架能够被随心所欲的使用,这时候JCL(Jakarta Commons Logging)出现了。JCL 只提供 log 接口,具体的实现则在运行时动态寻找。这样一来组件开发者只需要针对 JCL 接口开发,而调用组件的应用程序则可以在运行时搭配自己喜好的日志实践工具。
  • JCL可以实现的集成方案如下图所示:
    集成方案
  • JCL默认的配置:如果能找到Log4j 则默认使用log4j 实现,如果没有则使用jul(jdk自带的) 实现,再没有则使用jcl内部提供的SimpleLog 实现。于是,就出现了如下的代码处理:
	import org.apache.commons.logging.Log;
	import org.apache.commons.logging.LogFactory;
	
	Log log =LogFactory.getLog(Test.class);
	log.trace('trace');
  • 至于这个Log具体的实现类,JCL会在ClassLoader中进行查找。这么做有如下三个缺点:
    • 效率较低
    • 容易引发混乱
    • 在使用了自定义ClassLoader的程序中,使用JCL会引发内存泄露
  • 于是,又诞生了新的日志门面:slf4j。关于slf4j的集成图如下所示:
    slf4j集成图
    桥接说明
  • 日志门面接口本身通常并没有实际的日志输出能力,它底层还是需要去调用具体的日志框架API的,也就是实际上它需要跟具体的日志框架结合使用。由于具体日志框架比较多,而且互相也大都不兼容,日志门面接口要想实现与任意日志框架结合可能需要对应的桥接器,上图红框中的组件即是对应的各种桥接器!
	import org.slf4j.Logger;
	import org.slf4j.LoggerFactory;
	
	Logger logger = LoggerFactory.getLogger(Test.class);
	logger.info("info");

转换过程

  • 在代码中,并不会出现具体日志框架的API。应用程序会根据classpath中的桥接器类型,和日志框架类型,判断出logger.info应该以什么框架输出!注意了,如果classpath中不小心引了两个桥接器,那会直接报错的!因此,在阿里的开发手册上才有这么一条:
	强制:应用中不可直接使用日志系统(log4j、logback)中的 API ,而应依赖使用日志框架 SLF4J 中的 API 。使用门面模式的日志框架,有利于维护和各个类的日志处理方式的统一。

2.3 SpringBoot中logback日志集成

依赖图

  • SpringBoot底层使用 slf4j + logback的方式进行日志记录
    • logback-classic:logback的桥接器
  • SpringBoot也把其他的日志都替换为了slf4j
    • log4j-to-slf4j:log4j的适配器
    • jul-to-slf4j:jul的适配器
    • Spring默认的日志门面是:JCL

2.4 SpringBoot日志使用

2.4.1 声明日志记录器

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger(currentClassName.class);

2.4.2 日志级别

  • 可以设置如下几种日志级别:
    • trace:跟踪
      • 描述:最详细的日志级别,仅用于调试和开发过程中。
      • 作用:用于记录程序的详细运行信息,例如方法的入参、出参等。一般情况下,TRACE级别的日志不会被打印到生产环境中。
    • debug:调试
      • 描述:这是最详细的日志级别,主要用于开发阶段的调试。当开启DEBUG级别日志时,会记录程序运行过程中的所有详细信息,包括函数调用、变量值变化等。
      • 作用:对于排查代码逻辑问题、了解程序运行流程非常有帮助。但在生产环境中一般不建议长期开启,因为会产生大量的日志数据,影响性能并可能导致存储空间不足。
    • info:信息(SpringBoot默认的日志级别)
      • 描述:INFO级别的日志通常用来记录系统运行的关键事件或正常流程信息,例如服务启动、停止、配置加载成功等。
      • 作用:用于了解系统的基本运行状态和关键操作,是日常运维中最常用的一种日志级别。
    • warn:警告
      • 描述:WARN级别的日志用于记录可能潜在的问题或者非预期情况,但不影响系统整体运行的情况,比如资源占用过高、请求超时等。
      • 作用:通过监控WARN级别的日志,可以提前发现并预防可能存在的风险,避免小问题逐渐恶化成严重故障。
    • error:错误
      • 描述:ERROR级别的日志用于记录系统出现错误或异常情况,如业务处理失败、数据库连接断开等,这些情况可能会导致功能无法正常使用或部分服务中断。
      • 作用:ERROR日志是问题定位的关键线索,一旦发生此类日志,意味着系统出现了严重的故障或错误,需要立即进行排查修复。
    • fatal:致命
      • FATAL级别的日志是最严重的等级,表示系统发生了灾难性错误,通常会导致系统崩溃或无法提供服务,如宕机、核心组件失效等。
      • 作用:这类日志对保障系统稳定运行至关重要,一旦出现,应立即触发告警通知,并迅速展开问题应急响应。
  • 在配置文件中设置日志级别:
    logging:
      level:
        root: info # 设置所有日志的级别(默认值:info)
        com.trs: trace  # 自定义设置某个包下所有类的日志级别
    

2.4.3 日志格式

2024-05-27T21:04:10.760+08:00  INFO 16388 --- [springboot_demo] [  restartedMain] .ConditionEvaluationDeltaLoggingListener : Condition evaluation unchanged
2024-05-27T21:04:10.761+08:00 TRACE 16388 --- [springboot_demo] [  restartedMain] com.trs.SpringbootDemoApplication        : 跟踪
2024-05-27T21:04:10.761+08:00 DEBUG 16388 --- [springboot_demo] [  restartedMain] com.trs.SpringbootDemoApplication        : 调试
2024-05-27T21:04:10.761+08:00  INFO 16388 --- [springboot_demo] [  restartedMain] com.trs.SpringbootDemoApplication        : 信息
  • 可以使用logging.pattern.console修改默认的控制的日志格式
      %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
    
  • 日志的组成部分:
    • 日期和时间
      • %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint}
      • %clr 当前内容的颜色 {faint},其他颜色:blue、cyan、faint、green、magenta、red、yellow
      • (%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}),表示括号中要显示的内容。
        • {${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}
        • ${v:v0},SpringBoot的占位符 + null条件的表达式(如果v为null,则使用v0的值)
        • LOG_DATEFORMAT_PATTERN: 系统环境变量中的值,SpringBoot底层会根据对应的配置项将值设置到对应的环境变量中,如:LOG_DATEFORMAT_PATTERN=logging.pattern.dateformat 可以在官网4.7章节中看到对应的关系。
        • %d 是logback的日期显示方式
        • -yyyy-MM-dd HH:mm:ss.SSS 日期的格式
    • 日志级别
      • %clr(${LOG_LEVEL_PATTERN:-%5p})
      • %clr 日志颜色,会根据不同的日志级别输出对应的颜色
      • LOG_LEVEL_PATTERN:系统变量的值
      • %5 表示当前内容所占字符的长度
      • p 表示输出的日志级别
    • 进程ID
      • %clr(${PID:- }){magenta}
      • PID 是系统环境变量中的进程ID(由系统分配,无法指定)
    • '- - -'用于区分实际日志消息开始的分隔符
      • %clr(- - -){faint}
    • 线程名称
      • 用方括号括起来(对于控制台输出可能会被截断)
    • 记录日志的类
    • 日志消息
  • 日志文件输出:
    • 默认情况下,Spring Boot仅记录到控制台,不写日志文件。如果除了控制台输出外还想写日志文件,则需要在配置文件中设置一个logging.file.name或logging.file.path的属性。
      • logging.file.name
        • 可以只设置文件的名称, 如果没有设置路径会默认在项目的相对路径下
        • 可以指定路径 + 文件名:name: D:/mylog.log
      • logging.file.path
        • 不可以指定文件名称, 必须要指定一个物理文件夹路径,会默认使用spring.log
  • 日志迭代(轮转):
    • 如果您使用的是Logback,则可以使用application.properties或application.yaml文件微调日志轮播设置。
      相关属性
      *logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
      • ${LOG_FILE} 对应 logging.file.name的值
      • %d{yyyy-MM-dd} 指定日期格式
      • %i 索引,当文件超出指定大小后按文件索引递增
  • 自定义日志配置文件:
    • 可以通过在类路径中包含适日志配置文件来激活各种日志记录系统。
    • 注意:如果使用自定义日志配置文件会使用springboot中全局配置文件的logging相关配置失效。

2.4.4 切换日志框架

  • 将logback切换log4j2
    • (1)将logback的场景启动器排除(slf4j只能运行1个桥接器)
      <!--stater-web中自动添加了logback的依赖-->
      	<dependency>
      	     <groupId>org.springframework.boot</groupId>
      	     <artifactId>spring-boot-starter-web</artifactId>
      	     <exclusions>
      	        <exclusion>
      	           <groupId>org.springframework.boot</groupId>
      	           <artifactId>spring-boot-starter-logging</artifactId>
      	        </exclusion>
      	     </exclusions>
      	</dependency>
      
    • (2)添加log4j2的桥接器
       <!--添加log4j2的桥接器-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-log4j2</artifactId>
       </dependency>
      
    • (3)添加log4j2的配置文件
  • 将logback切换为log4j
    • (1)排除logback的桥接器
      <dependency>
          <!--starter-web里面自动添加starter-logging 也就是logback的依赖-->
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
          <exclusions>
              <exclusion>
                  <artifactId>logback-classic</artifactId>
                  <groupId>ch.qos.logback</groupId>
              </exclusion>
          </exclusions>
      </dependency>
      
    • (2)添加log4j的桥接器
      <!--log4j的桥接器-->
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
      </dependency>
      
    • (3)添加log4j的配置文件
      • log4j.properties
      #trace<debug<info<warn<error<fatal
      log4j.rootLogger=trace, stdout
      log4j.appender.stdout=org.apache.log4j.ConsoleAppender
      log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
      log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n`
      
      

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

气密检测中泄漏率的质量流量与体积流量的转换

对于R-134a等制冷剂&#xff0c;泄漏率通常表示为质量流量&#xff08;每年的逸出质量&#xff09;而不是体积流量&#xff08;特定时间段内给定压力下的逸出质量&#xff09;。因此&#xff0c;通过制冷剂的年泄漏量来定义泄漏级别&#xff0c;常用的单位为g/a。以某款车型为例…

Github 2024-05-29 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10C++项目3PHP项目1PHP:流行的Web开发脚本语言 创建周期:4710 天开发语言:C, PHP协议类型:OtherStar数量:37340 个Fork数量:7657 次…

从 0 手撸一个 pytorch

背景介绍 最近抽空看了下 Andrej Karpathy 的视频教程 building micrograd&#xff0c;教程的质量很高。教程不需要任何前置机器学习基础&#xff0c;只需要有高中水平的数学基础即可。整个教程从 0 到 1 手撸了一个类 pytorch 的机器学习库 micrograd&#xff0c;核心代码不到…

SAP PP学习笔记 - 错误 CX_SLD_API_EXCEPTION - Job dump is not fully saved (too big)

我这个错误是跑完MRP&#xff0c;然后在MD04查看在库/所有量一览&#xff0c; 点计划手配&#xff08;Planned order 计划订单&#xff09;生成 制造指图&#xff08;Production order 生产订单&#xff09;&#xff0c; 到目前这几步都OK&#xff0c;然后在制造指图界面点保…

Linux之sshpass命令

介绍 sshpass是一个工具&#xff0c;用于通过SSH连接到远程服务器时自动输入密码。它允许您在命令行中指定密码&#xff0c;以便在建立SSH连接时自动进行身份验证。 安装 # 以centos为例 yum install sshpass -y 使用方法 sshpass [-f filename | -d num | -p password | …

C++笔试强训day35

目录 1.奇数位丢弃 2.求和 3.计算字符串的编辑距离 1.奇数位丢弃 链接https://www.nowcoder.com/practice/196141ecd6eb401da3111748d30e9141?tpId128&tqId33775&ru/exam/oj 数据量不大&#xff0c;可以直接进行模拟&#xff1a; #include <iostream> #incl…

MQTT 5.0 报文解析 06:AUTH

欢迎阅读 MQTT 5.0 报文系列 的最后一篇文章。在上一篇中&#xff0c;我们已经介绍了 MQTT 5.0 的 DISCONNECT 报文。现在&#xff0c;我们将介绍 MQTT 中的最后一个控制报文&#xff1a;AUTH。 MQTT 5.0 引入了增强认证特性&#xff0c;它使 MQTT 除了简单密码认证和 Token 认…

没有可用软件包 docker-ce。 错误:无须任何处理

特么的各种百度查看&#xff0c;全是一些废话&#xff01;&#xff01;&#xff01;centos7安装不上docker&#xff0c;都是老的代码了&#xff1a; yum install docker-ce 解决方案&#xff1a; # CentOS yum install docker-io

Jetson Orin Nano v6.0 + tensorflow2.15.0+nv24.05 GPU版本安装

Jetson Orin Nano v6.0 tensorflow2.15.0nv24.05 GPU版本安装 1. 源由2. 步骤2.1 Step1&#xff1a;系统安装2.2 Step2: nvidia-jetpack安装2.3 Step3&#xff1a;jtop安装2.4 Step4&#xff1a;h5py安装2.5 Step5&#xff1a;tensorflow安装2.6 Step6&#xff1a;jupyterlab安…

Windows搭建Nginx代理本地盘的文件(共享路径或本地路径)

文章目录 Windows搭建Nginx代理本地盘的文件 - 前言需求背景挂载网络共享路径检查连接状态下载Nginx编辑 Nginx 配置文件启动 Nginx检测Nginx是否成功启动使用方法远程共享路径示例本地文件示例 测试 Windows搭建Nginx代理本地盘的文件 - 前言 在开发过程中&#xff0c;确保文…

广东省保健食品行业协会批复成为“世界酒中国菜”活动指导单位

广东省保健食品行业协会正式批复成为“世界酒中国菜”系列活动指导单位&#xff0c;共促餐饮文化交流发展 近日&#xff0c;广东省保健食品行业协会正式批复荐酒师国际认证&#xff08;广州&#xff09;有限公司&#xff0c;成为备受瞩目的“世界酒中国菜”系列活动的指导单位…

8.2 数组遍历访问

本节必须掌握的知识点&#xff1a; 示例三十 代码分析 汇编解析 在上一节中介绍了数组相关的概念&#xff0c;而在本节中将介绍数组的使用。 8.2.1 示例三十 ■访问数组 示例代码三十 ●第一步&#xff1a;分析需求&#xff0c;设计程序…

基于C++11实现的手写线程池

在实际的项目中&#xff0c;使用线程池是非常广泛的&#xff0c;所以最近学习了线程池的开发&#xff0c;在此做一个总结。 源码&#xff1a;https://github.com/Cheeron955/Handwriting-threadpool-based-on-C-17 项目介绍 项目分为两个部分&#xff0c;在初版的时候&#x…

STM32——定时器

一、简介 *定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 *16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 *不仅具备基本的定时中断功能&#xff0c;而且还包含内外时钟源选择、输入…

ubuntu使用oh my zsh美化终端

ubuntu使用oh my zsh美化终端 文章目录 ubuntu使用oh my zsh美化终端1. 安装zsh和oh my zsh2. 修改zsh主题3. 安装zsh插件4. 将.bashrc移植到.zshrcReference 1. 安装zsh和oh my zsh 首先安装zsh sudo apt install zsh然后查看本地有哪些shell可以使用 cat /etc/shells 将默…

平方回文数-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第73讲。 平方回文数&#…

监控云安全的9个方法和措施

如今&#xff0c;很多企业致力于提高云计算安全指标的可见性&#xff0c;这是由于云计算的安全性与本地部署的安全性根本不同&#xff0c;并且随着企业将应用程序、服务和数据移动到新环境&#xff0c;需要不同的实践。检测云的云检测就显得极其重要。 如今&#xff0c;很多企业…

windows tomcat服务注册和卸载

首页解压tomcat压缩包&#xff0c;然后进入tomcat bin目录&#xff0c;在此目录通过cmd进入窗口&#xff0c; 1&#xff1a;tomcat服务注册 执行命令&#xff1a;service.bat install tomcat8.5.100 命令执行成功后&#xff0c;会在注册服务列表出现这个服务&#xff0c;如果…

打造爆款活动:确定目标受众与吸引策略的实战指南

身为一名文案策划经理&#xff0c;我深知在活动策划的海洋中&#xff0c;确定目标受众并设计出能触动他们心弦的策略是何等重要。 通过以下步骤&#xff0c;你可以更准确地确定目标受众&#xff0c;并制定出有效的吸引策略&#xff0c;确保活动的成功&#xff1a; 明确活动目…

Unity【入门】环境搭建、界面基础、工作原理

Unity环境搭建、界面基础、工作原理 Unity环境搭建 文章目录 Unity环境搭建1、Unity引擎概念1、什么是游戏引擎2、游戏引擎对于我们的意义3、如何学习游戏引擎 2、软件下载和安装3、新工程和工程文件夹 Unity界面基础1、Scene场景和Hierarchy层级窗口1、窗口布局2、Hierarchy层…