1、springboot集成logback
首先先对springboot和logback做一个简单的集成。
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
logback依赖的核心包是logback-core、logback-classic、slf4j-api,spring-boot-start-web默认已经集成包括了这几个包。
可以进到web里面看一下
看到maven依赖的jar文件里也有相关的包
新建logback.xml文件
配置文件内容如下:
<?xml version='1.0' encoding='UTF-8'?>
<!--日志配置-->
<configuration>
<!--直接定义属性-->
<property name="" value=""/>
<!--通过配置文件定义属性-->
<springProperty name="" source=""/>
<!--定义并描述一个日志的输出属性-->
<appender name="" class="">
</appender>
<!--创建一个具体的日志输出-->
<logger name="" level="" additivity="">
<appender-ref ref=""/>
</logger>
<!--基础的日志输出-->
<root level="">
<appender-ref ref=""/>
</root>
</configuration>
上面的这一堆的配置到底是几个意思,看下面的这张图:
下面就按照上图里面的解释按个走一遍实例。
业务要求:规定controller报里面的日志打到controller文件里面去,service包里面的日志打到service文件里面去。并且每个日志文件的大小不能超过3M,超过以后将滚动保存到下一个日志文件。
2、实例演示
新建测试controller、service包
controller的测试代码
package com.springboot.logback.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.springboot.logback.service.ITestService;
@RestController
public class TestController {
private static final Logger LOG = LoggerFactory.getLogger(TestController.class);
@Autowired
private ITestService testService;
@GetMapping(value = "logTest")
public String logTest(String msg) {
if(StringUtils.isEmpty(msg)) {
LOG.info("the param is null!!");
return "the param is null!!";
}
LOG.info("the param is : {}",msg);
testService.testServiceMethod(msg);
return "success";
}
}
service的测试代码
package com.springboot.logback.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.springboot.logback.service.ITestService;
@Service
public class TestServiceImpl implements ITestService{
private static final Logger LOG = LoggerFactory.getLogger(TestServiceImpl.class);
@Override
public String testServiceMethod(String msg) {
LOG.info("this is a test serviceMethod,the msg is : {}",msg);
return "this is a test method,the msg is : "+msg;
}
}
配置application.properties文件
其实在application.properties文件中的配置说白了就是为不同的类配置参数,比如logging.config=classpath:logback.xml,进入之后就会发现就是为LoggingApplicationListener类配置了一个CONFIG_PROPERTY参数,用于加载logback.xml配置文件的路径。
配置logback.xml文件
1、定义两个全局变量,用于指定controller、service日志的输出文件位置和名称
<!-- 定义日志存储位置变量,可以是相对路径也可以是绝对路径 -->
<property name="serviceLogFile" value="logs/serviceLog"/>
<property name="controllerLogFile" value="logs/controllerLog"/>
2、定义一个controller的日志数据模板appender,用于规定controller日志的输出格式
<appender name="controllerFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${controllerLogFile}.log</file>
<encoder>
<!--日志输出格式-->
<pattern>%d [%thread] %-5level -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${controllerLogFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${maxFileSize}</maxFileSize>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
name代表模板的名称。class为滚动日志输出类。file为日志的位置和名称。encoder、pattern定义格式标签%d代表日期,全部配置为%d{yyyy-MM},花括号中定义日期格式,%d为%d{yyyy-MM-dd}的缩写;[%thread]代表线程;%-5level代表级别从左显示5个字符宽度;[%file:%line]代表哪个类文件和第几行;%msg%n代表消息和换行。
fileNamePattern代表日志滚后的命名规则,maxFileSize为最大日志大小
3、定义一个具体的日志输出
<!--创建一个具体的日志输出-->
<logger name="com.springboot.logback.controller" level="info" additivity="true">
<!--可以有多个appender-ref,即将日志记录到不同的位置-->
<!-- <appender-ref ref="STDOUT"/> -->
<appender-ref ref="controllerFile"/>
</logger>
appender-ref连接到日志模板controllerFile
4、运行测试
调用测试controller里面的测试接口
就会发现生成的controller日志文件和里面的内容
测试滚动日志生成
新建一个新的测试类用户生成大量日志
package com.springboot.logback.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestRollingPolicy {
private final static Logger LOG = LoggerFactory.getLogger(TestRollingPolicy.class);
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0;i<50000;i++) {
LOG.info("this massage is a text massage!!!");
}
}
}
执行main方法,就会发现生成了滚动日志
按照controller的方式新建service层和控制台的appender。另外再建一个全局的appender,用于输出controller、service之外的日志。所以完整的配载如下:
<?xml version='1.0' encoding='UTF-8'?>
<!--日志配置-->
<configuration>
<!--直接定义属性(全局变量)-->
<!-- 定义日志存储位置变量,可以是相对路径也可以是绝对路径 -->
<property name="testLogFile" value="logs/testLog"/>
<property name="serviceLogFile" value="logs/serviceLog"/>
<property name="controllerLogFile" value="logs/controllerLog"/>
<!-- 单个日志文件大小 -->
<property name="maxFileSize" value="3MB"/>
<!--控制台日志-->
<!-- appender类似于一个日志格式化模板,描述了日志的格式、规则、输出形式等 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- %d代表日期,%thread代表线程名,%-5level表示级别从左显示 5 个字符宽度,
%logger{50}表示 Logger 名字最长 50 个字符,[%file:%line]表示哪个类文件和第几行,
%msg代表日志消息,%n代表换行-->
<pattern>%d [%thread] %-5level %logger{50} -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--滚动文件日志-->
<appender name="testFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${testLogFile}.log</file>
<encoder>
<!--日志输出格式-->
<pattern>%d [%thread] %-5level -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${testLogFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${maxFileSize}</maxFileSize>
</rollingPolicy>
</appender>
<appender name="serviceFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${serviceLogFile}.log</file>
<encoder>
<!--日志输出格式-->
<pattern>%d [%thread] %-5level -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${serviceLogFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${maxFileSize}</maxFileSize>
</rollingPolicy>
</appender>
<appender name="controllerFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${controllerLogFile}.log</file>
<encoder>
<!--日志输出格式-->
<pattern>%d [%thread] %-5level -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${controllerLogFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${maxFileSize}</maxFileSize>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!--创建一个具体的日志输出-->
<logger name="com.springboot.logback.controller" level="info" additivity="true">
<!--可以有多个appender-ref,即将日志记录到不同的位置-->
<!-- <appender-ref ref="STDOUT"/> -->
<appender-ref ref="controllerFile"/>
</logger>
<logger name="com.springboot.logback.service" level="info" additivity="true">
<!--可以有多个appender-ref,即将日志记录到不同的位置-->
<!-- <appender-ref ref="STDOUT"/> -->
<appender-ref ref="serviceFile"/>
</logger>
<!--基础的日志输出-->
<root level="info">
<appender-ref ref="testFile" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
再次执行测试的controller接口,效果如下:
控制台:
logs文件夹下面:
springboot、logback集成的复习简单就到这了,logback还有很多其他的功能和用法,如项目中有需要可自行了解学习。
演示代码后续传到个人下载空间。