springboot集成logback及配置详解

本文介绍如何在SpringBoot项目中集成Logback实现日志管理,包括配置不同模块的日志输出路径及滚动策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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还有很多其他的功能和用法,如项目中有需要可自行了解学习。

演示代码后续传到个人下载空间。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值