跳至主要內容

Springboot-2.热部署&日志

holic-x...大约 5 分钟框架Springboot

Springboot-热部署&日志

springboot中devtools热部署

热部署

​ 为了进一步提高开发效率,springboot提供了全局项目热部署,日后在开发过程中修改了部分代码以及相关配置文件后,不需要每次重启使修改生效,在项目中开启了springboot全局热部署之后只需要在修改之后等待几秒即可使修改生效

热部署配置

(1)在pom.xml中引入依赖,开启热部署

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

(2)IDEA中开启配置

  • File-Settings-Compiler-Build Project automatically
  • ctrl + shift + alt + / ,选择Registry,勾上 Compiler autoMake allow when app running
  • 项目启动:run/debug模式启动,查看日志是否出现restartedMain代表已经生效,在使用热部署时如果遇到修改之后不能生效,请重试重启项目或重启idea再试

image-20240405120911573

springboot中的日志体系

日志架构演进

不同日志框架的应用

日志实现日志门面
log4j 淘汰JCL
jul java.util.logging 别的SJF4J
log4j2
logback
# log4j日志使用
import org.apache.log4j.Logger;

Logger logger = Logger.getLogger(Test.class);
logger.trace("trace");
# jul应用
import java.util.logging.Logger;
  
Logger loggger = Logger.getLogger(Test.class.getName()); 
logger.finest("finest");
# JCL
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

Log log =LogFactory.getLog(Test.class);
log.trace('trace');

JCL动态查找机制进行日志实例化,执行顺序为:commons-logging.properties---->系统环境变量------->log4j--->jul--->simplelog---->nooplog
# slf4j 日志门面接口
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger(Test.class);
logger.info("info");

​ 阿里巴巴开发手册:应用中不可直接使用日志系统(log4j、logback)中的 API ,而应依赖使用日志框架 SLF4J 中的 API 。使用门面模式的日志框架,有利于维护和各个类的日志处理方式的统一

image-20240405121445048

日志实战

案例1:一个项目,一个模块用log4j,另一个模块用slf4j+log4j2,如何统一输出?

​ 在某些中小型公司,这种情况很常见。研发不懂底层的日志原理,日志文件里头既有log4j.properties、又有log4j2.xml,各种API混用,导致日志记录乱七八糟

​ 如何统一输出:用slf4j的适配器,slf4j提供了各种各样的适配器,用来将某种日志框架委托给slf4j。其最明显的集成工作方式有如下:

image-20240405122025275

​ 根据适配器工作原理的不同,被适配的日志框架并不是一定要删除!以上图为例,log4j这个日志框架删不删都可以,只要能保证log4j的加载顺序在log4j-over-slf4j后即可。因为log4j-over-slf4j这个适配器的工作原理是,内部提供了和log4j一模一样的api接口,因此在程序中调用log4j的api的时候,必须想办法让其走适配器的api。如果删了log4j这个框架,那程序里肯定是走log4j-over-slf4j这个组件里的api。如果不删log4j,只要保证其在classpth里的顺序比log4j前即可

案例2:如何让spring以log4j2的形式输出?

image-20240405122244683

image-20240405122407457

Springboot日志

SpringBoot底层也是使用slf4j+logback的方式进行日志记录

  • logback桥接:logback-classic

Springboot将其他日志替换成了slf4j

  • slf4j适配:log4j-over-slf4j
  • jul适配:jul-to-slf4j
  • 这两个适配器都是为了适配Spring的默认日志:jc

Springboot日志使用

  • 设置TRACE(跟踪),DEBUG(调试),INFO(信息),WARN(警告),ERROR(异常),FATAL或OFF之一
# 日志格式设定
logging:
  level:
    root: "warn"
    org.springframework.web: "debug"
    org.hibernate: "error"

logging.pattern.consoleopen in new window:可修改默认的控制的日期格式:

# 日志格式设定
logging:
  level:
    root: "warn"
    org.springframework.web: "debug"
    org.hibernate: "error"
  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}"
  • 文件输出

一般情况下日志输出到控制台,可以将日志输出到日志文件,可设定一个logging.file.name或logging.file.path属性指定文件路径

logging.file.namelogging.file.path实例描述
(没有)(没有)仅控制台记录
指定文件名(没有)my.log写入指定的日志文件
(没有)具体目录/var/log写入spring.log指定的目录
  • logging.file.name:可设定文件名称,如果没有设置路径默认会在项目的相对路径下;可指定路径+文件名(例如name:D:/hello.log)
# 日志格式设定
logging:
  file:
    name: hello.log
// 配置文件名则默认在当前项目目录生成,配置指定路径+文件名则对应在指定路径生成日志文件    
  • logging.file.path:不可以指定文件名称, 必须要指定一个物理文件夹路径,会默认使用spring.log
# 日志格式设定
logging:
  file:
    path: E:/myLog
  • 日志迭代(轮转)

​ 如果使用Logback,则可使用application.yml文件微调日志轮播设置(对于其他日志记录系统,需要自己配置轮转设置)

名称描述
logging.logback.rollingpolicy.file-name-pattern归档的文件名
logging.logback.rollingpolicy.clean-history-on-start如果应在应用程序启动时进行日志归档清理。
logging.logback.rollingpolicy.max-file-size归档前日志文件的最大大小。
logging.logback.rollingpolicy.total-size-cap删除日志档案之前可以使用的最大大小。
logging.logback.rollingpolicy.max-history保留日志存档的天数(默认为7)
  • logging.logback.rollingpolicy.file-name-pattern

    • ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz

      • ${LOG_FILE} 对应 logging.file.name
      • %d{yyyy-MM-dd} 日期 年-月-日
      • %i 索引, 当文件超出指定大小后进行的文件索引递增
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3