目录
3.Spring Boot 默认的日志框架 slf4j+logback
一、热部署
1.为什么要用热部署
作用: 进一步提高开发效率,spring boot为我们提供了全局项目热部署,日后在开发过程中,修改了部分代码以及相关的配置文件,不再需要重新启动项目,热部署就会在项目中更新启动修改部分的代码。
2.热部署的优点和缺点
优点: 在修改代码的时候不用手动重启代码,提高了开发效率
缺点: 热部署只适合在本地开发时使用,正式发布不可以使用
3.配置过程
第一步:添加热部署依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<!--optional=true,依赖不会传递,该项目依赖devtools;之后
依赖boot项目的项目如果想要使用devtools,需要重新引入-->
<optional>true</optional>
</dependency>
第二步:在IDEA中勾选相关配置
再按住 ctrl+alt+shift+/ registry 勾选,配置完成重启IDEA即可验证
二、Spring Boot默认的日志框架
1.为什么使用日志?
在项目的开发过程中,我们可以通过 debug来寻找程序问题,但是在线上环境中就只能通过打印程序运行的日志来寻找问题。因此在开发中选择一个好的日志框架是非常重要的。
2.日志的介绍和规范
日志的框架有多种,但是主要的要记住三种使用方式,slf4j+logback、slf4j+log4j2、jcl+jul ,在使用的时候要注意不可以直接使日志实现框架,需借助日志门面框架使用日志实现。
jcl是使用类加载器(Class loader)来加载的,先加载到那个日志框架就用那个,在使用自定义类加载器的时候有可能造成内存溢出,使用时较为简单。
slf4j 是借助适配器和桥接器两个功能来实现日志整合的,使用slf4j和logback时他俩之间必须有一个桥接器(loback-classic),适配器的作用如图:
注意:不同日志实现框架对应不同的桥接器依赖
3.Spring Boot 默认的日志框架 slf4j+logback
slf4j+logback 的依赖在springboot的spring-boot-starter-web依赖中已经存在了,所以不用手动添加依赖了。Logback-class: logback桥接器
4.日志的配置
4.1 在yml或者properties文件中配置
#日志的介绍见spring.io logging栏
#日志的组成
#日期和时间: 毫秒精度,易于排序
#日志级别: trace<debug<info<warn<error
#进程id
#一个 "---" 分离器来区分实际日志消息的开始
#线程名称: 用"[]"括起来,里面是线程名(对于控制台输出可能会被截断)
#记录器名称: 这通常是源类名称(通常缩写)
#日志消息:
#日志的格式设置 --碰到%/&等特殊符号要用''引起来进行转义,要不会报错
#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}--指定()内的内容以什么颜色输出 faint(无颜色) 具体颜色见官网
# %d{}---
# ${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS} --采用${value: value2}springboot占位符格式 --当value为空,输出value2
# LOG_DATEFORMAT_PATTERN 系统属性值 对用配置文件中配置属性(官网4.7对映表)
# %i 索引 当文件超出指定大小后进行的文件索引递增
#日志输出
#1. name 可以设置日志输出文件的路径+名称(没设路径就在项目的相对路径下)
#logging.file.name=D:/cc.log
#2. path 可以设置日志输出文件的路径(没有办法设置名字,默认名字为spring.log)
#logging.file.path=D:/cc/
#日志的迭代
# logging.logback.rollingpolicy.file-name-patten ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
# ${LOG_FILE} logging.file.name
# %d{yyyy-MM-dd} 日期
# %i 索引,当文件超出指定大小后进行的文件索引递增
控制台的日志输出格式
4.2 自定义日志配置文件
Spring Boot只是提供了日志的基本配置,日志框架的一些高级功能没有被列入其中,所以我们可以在项目中配置一份自定义的配置文件,用来使用日志框架提供的高级功能。
在resources文件下添加一个logback-spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>sms</contextName>
<!--设置系统日志目录-->
<property name="log.path" value="log" />
<!--最多保留15天log-->
<property name="log.maxHistory" value="15" />
<!--日志格式-->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n" />
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!--输出到文件-->
<!-- 日志记录器,日期滚动记录 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 正在记录的日志文件的路径及文件名 -->
<fileNamePattern>${log.path}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<MaxHistory>${log.maxHistory}</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/debug/debug.%d{yyyy-MM-dd}.log</fileNamePattern>
<MaxHistory>${log.maxHistory}</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="debug">
<!--debug级别输出到文件和控制台-->
<appender-ref ref="console" />
<appender-ref ref="file_debug" />
</root>
<root level="info">
<!--info和error级别输出到文件-->
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
</configuration>
控制台的日志输出格式
5.自定义日志框架
在spring boot中不想使用logback日志框架 改用其他框架需要以下几个步骤(以log4j2为例)
第一步:在pom.xml文件中排除和导入依赖(不排除相应的logback的依赖运行时会出错,如果存在继承关系,也需要早父类依赖中排除spring-boot-starter-logging依赖)
<!--web启动依赖,包含springMVC的依赖
用于实现HTTP接口(包含springMVC),使用SpringMVC构建Web应用程序,使用Tomcat作为默认的嵌入式容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!--排除Starter-logging 排除logback日志依赖-->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加log4j2日志依赖 用什么日志就添加什么-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
第二步:在resources文加下添加一个log4j2.xml文件(因为在yml文件中的日志配置信息是logback的,log4j2无法完全识别,需要从新添加一个配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} ------- %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
控制台的日志输出结果