日志是必需的。日志的操作必须是可统一控制、分级管理同时能保留到本地的。
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"/><PatternLayoutpattern="[%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>
打完收工。