SpringBoot整合Logback,滚动记录+多文件

简介: logback-spring.xml配置文件实现日志分级输出,支持控制台、文件滚动存储,按模块(如SQL、支付、任务等)分离日志,通过LogProxy获取指定名称的Logger,便于定位问题。配置灵活,适用于多环境部署。

1.logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>






<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>debug</level>
    </filter>
    <encoder>
        <pattern>${PATTERN}</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

<!--输出到文件-->
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGHOME}/log_info.log</file>
    <encoder>
        <pattern>${PATTERN}</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOGHOME}/info/log-info-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>15</maxHistory>
    </rollingPolicy>
</appender>

<!-- 时间滚动输出 SQL日志 -->
<appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGHOME}/sql.log</file>
    <encoder>
        <pattern>${PATTERN}</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOGHOME}/sql/sql-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>15</maxHistory>
    </rollingPolicy>
</appender>

<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGHOME}/error.log</file>
    <encoder>
        <pattern>${PATTERN}</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOGHOME}/error/error-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>15</maxHistory>
    </rollingPolicy>
</appender>

<!-- 时间滚动输出 请求参数 日志 -->
<appender name="REQUEST_PARAM_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGHOME}/request_param.log</file>
    <encoder>
        <pattern>${PATTERN}</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOGHOME}/request_param/request_param-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>15</maxHistory>
    </rollingPolicy>
</appender>

<!--支付-->
<appender name="PAY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGHOME}/pay.log</file>
    <encoder>
        <pattern>${PATTERN}</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOGHOME}/pay/pay-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>15</maxHistory>
    </rollingPolicy>
</appender>

<!--定时任务-->
<appender name="JOB_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGHOME}/job.log</file>
    <encoder>
        <pattern>${PATTERN}</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOGHOME}/job/job-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>15</maxHistory>
    </rollingPolicy>
</appender>

<!--支付-->
<logger name="PAY_LOG" additivity="${ADDITIVITY}">
    <level value="INFO"/>
    <appender-ref ref="PAY_FILE"/>
</logger>
<!--任务-->
<logger name="JOB_LOG" additivity="${ADDITIVITY}">
    <level value="INFO"/>
    <appender-ref ref="JOB_FILE"/>
</logger>
<!--错误-->
<logger name="ERROR_LOG" additivity="${ADDITIVITY}">
    <level value="ERROR"/>
    <appender-ref ref="ERROR_FILE"/>
</logger>
<!--请求参数-->
<logger name="INFO_LOG" additivity="${ADDITIVITY}">
    <level value="INFO"/>
    <appender-ref ref="INFO_FILE"/>
</logger>
<!--请求参数-->
<logger name="REQUEST_PARAM_LOG" additivity="${ADDITIVITY}">
    <level value="INFO"/>
    <appender-ref ref="REQUEST_PARAM_FILE"/>
</logger>
<!--sql日志输出设置-->
<logger name="cn.zhicall.web.dao" additivity="${ADDITIVITY}">
    <level value="DEBUG"/>
    <appender-ref ref="SQL_FILE"/>
</logger>
<!--第三方日志输出配置-->
<logger name="java.sql.Connection" additivity="${ADDITIVITY}">
    <level value="DEBUG"/>
    <appender-ref ref="SQL_FILE"/>
</logger>
<logger name="java.sql.Statement" additivity="${ADDITIVITY}">
    <level value="INFO"/>
    <appender-ref ref="SQL_FILE"/>
</logger>
<logger name="java.sql.PreparedStatement" additivity="${ADDITIVITY}">
    <level value="DEBUG"/>
    <appender-ref ref="SQL_FILE"/>
</logger>
<logger name="com.alibaba.druid" additivity="${ADDITIVITY}">
    <level value="DEBUG"/>
    <appender-ref ref="SQL_FILE"/>
</logger>
<logger name="java.sql.ResultSet" additivity="${ADDITIVITY}">
    <level value="INFO" />
    <appender-ref ref="SQL_FILE" />
</logger>
<!-- spring的日志输入设置 -->
<logger name="org.springframework" additivity="${ADDITIVITY}">
    <level value="INFO"/>
    <appender-ref ref="INFO_FILE"/>
</logger>
<logger name="org.mybatis.spring.mapper" additivity="${ADDITIVITY}">
    <level value="INFO"/>
    <appender-ref ref="INFO_FILE"/>
</logger>
<!-- MyBatis日志输出设置 -->
<logger name="org.apache.ibatis" level="DEBUG" additivity="${ADDITIVITY}">
    <level value="INFO"/>
    <appender-ref ref="SQL_FILE"/>
</logger>
<logger name="org.apache.ibatis.io.ResolverUtil" additivity="${ADDITIVITY}">
    <level value="INFO"/>
    <appender-ref ref="SQL_FILE"/>
</logger>

<root level="debug">
    <appender-ref ref="CONSOLE" />
</root>


2.使用示例
package cn.test.web.controller.im;

import com.zhicall.framework.core.common.utils.log.LogProxy;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.concurrent.TimeUnit;

/**

  • @author Herb
  • @create 2020-04-26 13:05
    **/
    @RestController
    @RequestMapping("/test")
    public class TestController {

    private Logger logger = LogProxy.getLogger("INFO_LOG");

    private Logger logger2 = LogProxy.getLogger("ERROR_LOG");

    @Autowired
    private ImPlatformDoctorService imPlatformDoctorService;

    @Autowired
    protected RedisTemplate redisTemplate;

    @GetMapping("/getuser")
    public void getuser() {

     logger.info("进入getUser(INFO_LOG-INFO)");
     logger.error("进入getUser(INFO_LOG-ERROR)");
     logger2.error("进入getUser(ERROR_LOG-ERROR)");
     imPlatformDoctorService.queryDoctorConfig(10407L, "1");
    

    }

}

目录
相关文章
|
XML Java 数据格式
【二十九】springboot整合logback实现日志管理
【二十九】springboot整合logback实现日志管理
940 1
|
4月前
|
人工智能 安全 Shell
Harness Engineering 被讲烂之后,Agent 工程真正难的是什么?
看 Anthropic、OpenAI、Gemini 的 Harness 都在做啥?
598 0
|
4月前
|
人工智能 调度 流计算
Why Will OPC One-Person Companies Emerge in the AI Era? Understanding the New Individual Business Model Driven by AI Agents
AI时代一人公司(OPC)兴起,源于大模型、AI智能体与自动化工具对个体能力的倍增效应:单人即可调度AI完成研发、营销、交付等全链路闭环,实现“一人成军”。
432 2
|
7月前
|
关系型数据库 MySQL 应用服务中间件
踩坑必看!配置了 Docker 镜像源,为啥还在疯狂访问官方仓库?
一问搞懂 registry-mirrors 配置,本文就把这个问题的底层逻辑、常见场景和终极解决方案一次性讲透,适配Docker 20+/24+全版本,看完再也不踩这个坑。
3495 6
|
8月前
|
安全 Java API
Spring Boot 4 升级实战:从3.x到4.0的分步升级保姆级指南
Spring Boot 4.0于2025年11月发布,基于Spring Framework 7.0,实现模块化(47个轻量自动配置)、JSpecify空安全校验、原生API版本控制等重大升级。镜像减19%、启动快33%,迁移平滑,3.5.x支持至2026年11月。(239字)
6579 1
|
设计模式 NoSQL Java
网易面试:SpringBoot如何开启虚拟线程?
虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是 Java 并发编程领域的一项重要创新。 > PS:虚拟线程正式发布于 Java 长期支持版(Long Term Suort,LTS)Java 21(也就是 JDK 21)。 虚拟线程是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。 操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下: ![image.png](https:
1439 0
网易面试:SpringBoot如何开启虚拟线程?
|
Go 开发者
|
XML Java 数据库连接
Springboot中使用日志框架
Springboot中使用日志框架
658 0
|
IDE Java Maven
【项目问题解决】SpringBoot错误: 找不到或无法加载主类
SpringBoot应用启动时若出现“找不到或无法加载主类”错误,常见原因包括配置问题、编译问题或IDE设置不当。解决方法包括:检查`application.properties`配置,执行`maven clean install`,删除`.idea`文件后重导入IDEA,确保启动类路径正确,清理并重新编译项目,检查项目配置、依赖项及IDEA配置。参考CSDN和知乎相关文章。
11629 0

热门文章

最新文章