Springboot-2.热部署&日志
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再试
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 。使用门面模式的日志框架,有利于维护和各个类的日志处理方式的统一
日志实战
案例1:一个项目,一个模块用log4j,另一个模块用slf4j+log4j2,如何统一输出?
在某些中小型公司,这种情况很常见。研发不懂底层的日志原理,日志文件里头既有log4j.properties、又有log4j2.xml,各种API混用,导致日志记录乱七八糟
如何统一输出:用slf4j的适配器,slf4j提供了各种各样的适配器,用来将某种日志框架委托给slf4j。其最明显的集成工作方式有如下:
根据适配器工作原理的不同,被适配的日志框架并不是一定要删除!以上图为例,log4j这个日志框架删不删都可以,只要能保证log4j的加载顺序在log4j-over-slf4j后即可。因为log4j-over-slf4j这个适配器的工作原理是,内部提供了和log4j一模一样的api接口,因此在程序中调用log4j的api的时候,必须想办法让其走适配器的api。如果删了log4j这个框架,那程序里肯定是走log4j-over-slf4j这个组件里的api。如果不删log4j,只要保证其在classpth里的顺序比log4j前即可
案例2:如何让spring以log4j2的形式输出?
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.console:可修改默认的控制的日期格式:
# 日志格式设定
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.name | logging.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 索引, 当文件超出指定大小后进行的文件索引递增