Spring Boot的starter中默认使用的日志框架是logback
;平时我们使用日志时的代码是这样的
/**
* Created by Sanisy on 2018/2/16.
*/
@Controller
@RequestMapping(value = "/chat")
public class ChatController {
private static final Logger logger = LoggerFactory.getLogger(ChatController.class);
@RequestMapping(value = "/sayHello")
@ResponseBody
public String sayHello(){
logger.info("this is logging test, {}", "Spring Boot");
return "Hello, welcome to here!";
}
}
我们每一个类都需要初始化一个Logger
,写多了会觉得很烦,太浪费时间了;不过庆幸的是这里有一个第三方插件,帮我们做这些事,这个插件就是lombok
,lombok
可以帮我们省很多事情,比如说我们的JavaBean
的get
和set
方法,使用lombok
的@Data
注解即可;上面的logger只需要使用lombok
的@Slf4j
注解即可,给我们的开发工作带来了很大的方便。
lombok
插件的Maven
配置:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.8</version>
<scope>provided</scope>
</dependency>
添加lombok
之后我们的日志使用方式是这样的
/**
* Created by Sanisy on 2018/2/16.
*/
@Slf4j
@Controller
@RequestMapping(value = "/chat")
public class ChatController {
@RequestMapping(value = "/sayHello")
@ResponseBody
public String sayHello(){
log.info("this is logging test, {}", "Spring Boot");
return "Hello, welcome to here!";
}
}
日志的需求往往需要按天来输出、并且为了便于查找,我们又将一天的日志按照一定的大小进行切割成多个子日志文件。Spring Boot
自带的日志并没有默认实现这种功能,我们需要自己来设定。由于我们使用的是logback
日志框架,所以我们需要创建一个日志配置文件来覆盖Spring Boot
的默认的日志配置。Spring Boot
的默认的配置文件格式是xxx-spring.xml
,所以我们在src
的resources
目录下创建logback-spring.xml
文件即可。文件的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback-demo</contextName>
<!--自定义变量参数-->
<property name="log.dir" value="F:/logs/" />
<!--输出到控制台 ConsoleAppender-->
<appender name="consoleLog1" class="ch.qos.logback.core.ConsoleAppender">
<!--展示格式 layout-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger - %msg%n</pattern>
</pattern>
</layout>
<!--
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
-->
</appender>
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
所以我们使用下面的策略,可以避免输出 Error 的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤 Error-->
<level>ERROR</level>
<!--匹配到就禁止-->
<onMatch>DENY</onMatch>
<!--没有匹配到就允许-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${log.dir}/iag-info.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${log.dir}/iag-info.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
<maxFileSize>5KB</maxFileSize>
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level %logger %line - %msg%n</pattern>
</encoder>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${log.dir}/iag-error.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${log.dir}/iag-error.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
<!--设置日志文件切割的大小-->
<maxFileSize>5KB</maxFileSize>
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<!--指定最基础的日志输出级别-->
<root name="com.sunshine" additivity="false" level="info">
<!--appender将会添加到这个logger-->
<appender-ref ref="consoleLog1"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
lombok
可以通过property
标签来定义自己的变量,然后可以在配置文件中通过${变量名}
的方式来使用。我们需要根据日期和大小进行日志切割,所以需要用到的滚动策略为SizeAndTimeBasedRollingPolicy
,这个策略需要设置FileNamePattern
和maxFileSize
。FileNamePattern
设置的是切割生成的文件的名称,maxFileSize
设置的是当日志文件的大小达到指定大小时会对日志文件进行切割。
需要注意的是
<pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
,这里的{36}
表示的是Logger的类信息超过36个字节时,会对信息进行压缩显示。