日志是必需的。日志的操作必须是可统一控制、分级管理同时能保留到本地的。
8.1 SpringBoot默认的日志框架
SpringBoot支持多种日志框架,通常情况下,这些日志由一个日志抽象层和一个日志实现层搭建完成,日志抽象层是为了记录日志提供的一套标准且规范的框架,其作用是为记录日志提供接口。日志实现层是由日志抽象层实现的框架。
SpringBoot常见的日志抽象层有jcl(jakarta commons logging)、slf4j(simple logging facade for java)、jboss-logging等,常见的日志实现层有log4j、jul(java.util.logging)、log4j2、logback等,SpringBoot默认使用的日志抽象层是slf4j,默认使用的日志实现层是logback。
但是鉴于实际的使用性能和主流框架,这里实现层还是选用log4j2(它也具有Logback的所有特性)。
需要特别说明的是,在实际开发中,执行记录日志的操作不应该调用日志实现层的方法,而应该调用日志抽象层的方法。
8.2 打印日志
- 鉴于使用了log4j2,需要引入log4j2的依赖,同时需要排除SpringBoot原始的默认实现层框架。
pom.xml进行更改
<!--将spring-web中的logging进行剔除,避免日志冲突-->
<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>
- 在使用slf4j打印日志时,需要创建日志对象
1,在UserController控制类创建日志对象,注意,引入的包是org.slf4j
Logger logger= LoggerFactory.getLogger(UserController.class);
或者
Logger logger= LoggerFactory.getLogger(getClass());//推荐这个
2,以主要的info为例,可以填写单个参数,也可以使用占位符进行日志输出
logger.info("hello,this is logcat");
logger.info("hello,{},My name is {}","SpringBoot","Lilei");
8.3 保持日志
日志不仅仅要在控制台上显示,有时候更需要以文本形式保持,方便问题回朔。
在SpringBoot项目的application.properties中,可以配置日志的相关属性。
logging.file.path=dir //在当前项目根目录下订单dir文件夹中生产日志文件,也可以本地目录 D:\\dir
logging.file.name=xxx.log //指定日志文件名
logging.logback.rollingpolicy.max_history=7 //最多缓存7天
logging.logback.rollingpolicy.max-file-size=12KB //单文件最大12KB
8.4 log4j2.xml配置文件
项目中使用log4j2进行日志实现,最快捷方便的方法是在resources文件夹下添加log4j2.xml文件,直接将配置信息写入到专属日志配置文件中。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="fatal">
<Properties>
<!--定义一个日志保存目录,mac/linux使用${sys:user.home}/logs表示用户名下面的logs目录下-->
<Property name="baseDir" value="C:\mytest01"/>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="info" onMatch="ACCEPT"
onMismatch="DENY"/>
<PatternLayout
pattern="[%d{MM:dd HH:mm:ss.SSS}] [%level] [%logger{36}] - %msg%n"/>
</Console>
<!--debug级别日志文件输出-->
<RollingFile name="debug_appender" fileName="${baseDir}/debug.log"
filePattern="${baseDir}/debug_%i.log.%d{yyyy-MM-dd}">
<!-- 过滤器 -->
<Filters>
<!-- 限制日志级别在debug及以上在info以下 -->
<ThresholdFilter level="debug"/>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<!-- 日志格式 -->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<!-- 策略 -->
<Policies>
<!-- 每隔一天转存 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 文件大小 -->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<!-- info级别日志文件输出 -->
<RollingFile name="info_appender" fileName="${baseDir}/info.log"
filePattern="${baseDir}/info_%i.log.%d{yyyy-MM-dd}">
<!-- 过滤器 -->
<Filters>
<!-- 限制日志级别在info及以上在error以下 -->
<ThresholdFilter level="info"/>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<!-- 日志格式 -->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<!-- 策略 -->
<Policies>
<!-- 每隔一天转存 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 文件大小 -->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<!-- error级别日志文件输出 -->
<RollingFile name="error_appender" fileName="${baseDir}/error.log"
filePattern="${baseDir}/error_%i.log.%d{yyyy-MM-dd}">
<!-- 过滤器 -->
<Filters>
<!-- 限制日志级别在error及以上 -->
<ThresholdFilter level="error"/>
</Filters>
<!-- 日志格式 -->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<!-- 每隔一天转存 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 文件大小 -->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="debug_appender"/>
<AppenderRef ref="info_appender"/>
<AppenderRef ref="error_appender"/>
</Root>
</Loggers>
</Configuration>
打完收工。