devtool热部署
为了进一步提高开发效率,springboot为我们提供了全局项目热部署,日后在开发过程中修改了部分代码以及相关配置文件后,不需要每次重启使修改生效,在项目中开启springboot全局热部署之后只需要在修改之后等待几秒即可使修改生效。
开启热部署
-
引入相关依赖
1 2 3 4 5
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
Java的日志体系
日志门面
每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,这就大大的增加应用程序代码对于日志框架的耦合性。
为了解决这个问题,就是在日志框架和应用程序之间架设一个沟通的桥梁,对于应用程序来说,无论底层的日志框架如何变,都不需要有任何感知。只要门面服务做的足够好,随意换另外一个日志框架,应用程序不需要修改任意一行代码,就可以直接上线。总而言之,日志门面用于整合不同日志框架的日志(类似接口),不实现具体日志
常见的日志门面
- JCL(Java Common Logging):Java自带的日志门面
- SLF4J:目前最常用的日志门面
JCL
用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的jul, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。
JCL默认的情况下,会使用JUL日志框架做日志的记录操作。
JCL使用原则:如果有log4j,优先使用log4j,如果没有任何第三方日志框架的时候,使用的就是JUL。再没有则使用JCL内部提供的 SimpleLog 实现
具体实现
-
导入相关依赖
-
编写业务代码
1 2 3 4 5 6 7
public class JulMain { public static void main(String[] args){ Log log= LogFactory.getLog(JulMain.class) log.info("Hello world"); } }
SLF4J
简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架,
主要意义:提供接口,具体的实现可以交由其他日志框架,例如log4j和logback等。
对于一般的Java项目而言,日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j、logback等),中间使用桥接器完成桥接。所以我们可以得出SLF4J最重要的两个功能就是对于日志框架的绑定以及日志框架的桥接。
具体使用
-
引入相关依赖
1 2 3 4 5 6 7 8 9 10 11 12 13
<!--slf4j 核心依赖--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <!--slf4j 自带的简单日志实现 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> </dependency> <!--具体日志框架的slf4j桥接器(可选)-->
-
编写业务代码(如果在没有任何其他日志实现框架集成的基础之上,slf4j使用的就是自带的框架slf4j-simple,slf4j-simple也必须以单独依赖的形式导入进来。)
1 2 3 4 5 6 7 8 9 10
public class SLF4JTest01 { // 都是slf4j包下的 Logger logger = LoggerFactory.getLogger(SLF4JTest.class); logger.trace("trace信息"); logger.debug("debug信息"); logger.info("info信息"); logger.warn("warn信息"); logger.error("error信息"); }
日志实现和对应的日志门面
日志实现 | 日志门面 |
---|---|
log4j(已经淘汰) | JCL/SLF4J |
JUL(java.utils.logging) | JCL |
log4j2 | SLF4J |
logback | SLF4J |
提示
记录日志不能直接使用日志实现框架,必须通过日志门面来实现
日志实现
JUL
JUL全称 Java Util Logging,核心类在java.util.logging包下,它是java原生的日志框架,使用时不需要另外引用第三方的类库,相对其他的框架使用方便,学习简单,主要是使用在小型应用中。
组件构成
- Logger:被称为记录器,应用程序通过获取Logger对象,调用其API来发布日志信息。Logger通常被认为是访问日志系统的入口程序。
- Handler:处理器,每个Logger都会关联一个或者是一组Handler,Logger会将日志交给关联的Handler去做处理,由Handler负责将日志做记录。Handler具体实现了日志的输出位置,比如可以输出到控制台或者是文件中等等。
- Filter:过滤器,根据需要定制哪些信息会被记录,哪些信息会被略过。
- Formatter:格式化组件,它负责对日志中的数据和信息进行转换和格式化,所以它决定了我们输出日志最终的形式。
- Level:日志的输出级别,每条日志消息都有一个关联的级别。我们根据输出级别的设置,用来展现最终所呈现的日志信息。根据不同的需求,去设置不同的级别。
示例代码
|
|
SpringBoot日志框架
SpringBoot框架底层使用slf4j+logback的方式进行日志记录同时对于其他日志实现都提供了slf4j日志门面的集成
SpringBoot日志使用
日志级别
- trace:日志追踪信息
- debug:日志详细信息
- info:日志的关键信息 默认打印级别
- warn:日志警告信息
- error:日志错误信息
只有级别大于日志核心配置文件的 rootlevel 的信息才会输出,SpringBoot默认的 rootlevel 是info
可以在application.yml中进行 rootlevel 的修改
|
|
日志记录器声明
方法一:Java语句声明
|
|
方法二:使用注解@Slf4j(这个注解基于lombok依赖)
|
|
日志格式
默认格式
- 日期和时间:毫秒精度,易于排序
- 日志级别:ERROR,WARN,INFO,DEBUG,或TRACE
- 进程ID
- —:分离器来区分实际日志消息的开始。
- 线程名称:用方括号括起来(对于控制台输出可能会被截断)
- 记录器名称:这通常是源类名称(通常缩写)。
- 日志消息。
修改默认格式
可以在application.yml中修改logging.pattern.console属性来修改格式详情常见SpringBoot官方文档
|
|
日志输出
日志默认在控制台输出,可以通过修改applicaiton.yml中的logging.file.name和logging.file.path来输出日志文件
|
|
日志的归档和迭代
在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) |
示例代码
|
|
切换日志框架
将SpringBoot底层默认日志框架logback修改为log4j2
-
排除logback的场景启动器
1 2 3 4 5 6 7 8 9 10 11 12 13 14
<dependencies> <dependency> <!‐‐starter‐web里面自动添加starter‐logging 也就是logback的依赖‐‐> <groupId>org.springframework.boot</groupId> <artifactId>spring‐boot‐starter‐web</artifactId> <exclusions> <!‐‐排除starter‐logging 也就是logback的依赖‐‐> <exclusion> <artifactId>spring‐boot‐starter‐logging</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> </dependencies>
-
添加log4j2的场景启动器
1 2 3 4 5
<!‐‐Log4j2的场景启动器‐‐> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring‐boot‐starter‐log4j2</artifactId> </dependency>