热部署和日志
热部署
为了进一步提高开发效率,springboot为我们提供了全局项目热部署,日后在开发过程中修改了部分代码以及相关配置文件后,不需要每次重启使修改生效,在项目中开启了springboot全局热部署之后只需要再修改之后等待几秒即可修改生效。
- 1、开启热部署
在项目中引入依赖
<!--热部署依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
- 2、idea中配置
- 2.1
- 2.2
日志
如果要更换日志实现比如log4j到jul
混乱的java日志体系-代码演示
- 测试jul
import java.util.logging.Logger;
/**
* @author : zhouzhiqiang
* @date : 2024/6/24 15:00
* @description :崇尚官方开发组使用jul
*/
public class JULMain {
public static void main(String[] args) {
Logger log=Logger.getLogger(JULMain.class.getName());
log.info("崇尚官方开发组使用jul");
}
}
- log4j测试
- 引入依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
- 自定义log4j.properties
# 设置日志根
# 设置日志根 trance<debug<info<warn<error<fetal
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
- 测试类
import org.apache.log4j.Logger;
/**
* @author : zhouzhiqiang
* @date : 2024/6/24 15:00
* @description :崇尚开源开发组使用log4j
*/
public class Log4jMain {
public static void main(String[] args) {
Logger logger=Logger.getLogger(Log4jMain.class);
logger.info("崇尚开源开发组使用log4j");
}
}
由以上两种可以看出如何直接使用日志就会出现两种日志在统一的时候不好管理的问题
为了解决这个问题,应该使用sl4j门面来做:
强制:应用中不可直接使用日志系统(log4j、logback)中的API,而应该依赖使用日志框架中的API。使用门面模式的日志框架,有利于维护各个类的日志处理方式的统一。
门面使用
对于log4j,log4j.properties是必须的
- Jul测试
- 添加门面依赖
<!--引入jcl门面依赖-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
- 添加日志实现commons-logging.properties
org.apache.commons.logging.log=org.apache.commons.logging.impl.Jdk14Logger
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author : zhouzhiqiang
* @date : 2024/6/24 15:00
* @description :崇尚官方开发组使用jul
* jul(实现)+jcl(门面)
*/
public class JULMain {
public static void main(String[] args) {
Log log = LogFactory.getLog(JULMain.class);
log.info("崇尚官方开发组使用jul");
}
}
- log4j测试
- 添加依赖
<!--log4j核心依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--slf4j门面的核心依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
- 添加桥接器
<!--添加sl4j ->sl4j的桥接器-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.29</version>
</dependency>
- 测试代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author : zhouzhiqiang
* @date : 2024/6/24 15:00
* @description :崇尚开源开发组使用log4j
* log4js(实现)+sl4j(门面)
*/
public class Log4jMain {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(Log4jMain.class);
logger.info("崇尚开源开发组使用log4j");
}
}
上述代码虽然使用了门面但是有两种日志门面,必须进行统一
统一两种日志
只需要添加日志转换适配器依赖就可以了
下述是jcl到slf4j的统一
<!--为了日志统一实现,将jcl转换到slf4j 添加jcl到slf4j的适配器依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.30</version>
</dependency>
此时不需要改代码jcl就自动转到sLf4j,运行效果如下:
springboot默认的日志框架
SpringBoot底层也是使用slf4j+logback的方式进行日志记录
logback桥接:logback-classic
SpringBoot也把其他日志都替换成了slf4j
log4j适配:log4j-over-sl4j
jul适配:jul-to-slf4j
这两个适配器都是为了适配Spring的默认日志:jcl
SpringBoot日志的级别
SpringBoot默认的日志级别是info级别(比info级别高的都可以输出)
在SpringBoot中使用
- 自己声明
//声明日志记录器
static Logger logger = LoggerFactory.getLogger(MyApplication.class);
- 使用注解@Slf4j
@Slf4j 注解是依赖于lombok的
测试代码
@SpringBootApplication
@Slf4j
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
log.trace("跟踪");
log.debug("调试");
log.info("信息");
log.warn("警告");
log.error("报错");
}
}
日志级别
- 日志级别
可以设置trace<debug<info<warn<error<fatal级别由低到高 - 可以在配置文件中修改springboot默认的日志级别
logging:
level:
root: trace
SpringBoot日志的格式
- 详细介绍
可以使用 pattern: console: 来修改默认的输出格式
logging:
level:
com.com.springboot: trace
pattern:
console:
SpringBoot日志的文件输出
默认情况下,Spring Boot仅仅记录到控制台,不写日志文件。如果除了控制台输出外还想写日志文件,则需要设置一个loggin.file.name或者logging.file.path属性
- logging.file.name
logging.file.name:可以设置文件的名称,如果没有设置路径会默认在项目的相对路径
logging:
level:
com.com.springboot: trace
pattern:
console:
file:
name: D:/logs/aa.log
- logging.file.path
不可以指定文件名称,必须要指定一个物理文件夹路径,文件名默认是spring
SpringBoot日志的归档
logging.logback.rollingpolicy.max-file-size:配置配置文件大小
logging.file.name=D:/logs/aa.log
logging.logback.rollingpolicy.max-file-size=5KB
logging.logback.rollingpolicy.max-history=5 #归档文件保留天数
SpringBoo自定义日志配置文件
通过自定义日志配置文件,可以发送日志邮件,或者将日志直接保存到数据库
SpringBoot默认日志框架切换到其他日志框架
例如:springboot默认的logback切换到log4j2
只需要加一个log4j2的场景启动器就可以了,但是要排除logback的日志桥接器(slf4j只能运行有一个日志桥接器),否则会报错
<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>
<!--log4j2的场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>