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

简介: `logback-spring.xml` 是 Spring Boot 项目的日志配置文件,支持控制台与文件双输出,按级别分离日志(INFO、ERROR、SQL 等),并实现每日滚动归档。通过 `LogProxy.getLogger("XXX_LOG")` 可获取指定日志类型,配合 logger 配置实现精细化输出管理,适用于多环境灵活部署。

1.logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--logback日志配置文件
注意事项:
    1.更改对应LOGHOME(可变更为环境变量、指定Windows/Linux路径)
    2.日志打印级别如需更改,直接更改logger里面的即可
    3.sql打印路径为dao路径
使用说明:
    1.在对应文件如:需要打印任务相关:protected final Logger job_logger = LogProxy.getLogger("JOB_LOG");
    2.getLogger("JOB_LOG")里面的name需和logger标签里保持一致
    3.LogProxy引入路径:import com.zhicall.framework.core.common.utils.log.LogProxy;
      (Logger logger = org.slf4j.LoggerFactory.getLogger(loggerName)等效)
启动加载:
    1.SpringBoot默认加载recources路径下名为:logback-spring的文件
    2.手动在springboot配置文件(application.yml/application.properties)加载
    3.按照当前智康在program arguments中指明(可以避免更改多个环境的问题)
-->
<configuration  scan="true" scanPeriod="60 seconds" >
    <!-- 1.若是additivity设为false,则子Logger只会在自己的appender里输出,不会在root的logger的appender里输出
        2.若是additivity设为true,则子Logger不止会在自己的appender里输出,还会在root的logger的appender里输出 -->
    <property name="ADDITIVITY" value="false"/>
    <property name="LEVEL" value="DEBUG"/>
    <property name="LOGHOME" value="D://hulog//"/>
    <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %X{logChainId} %-5level %logger{50} - %msg%n"/>
    <!--输出到控制台-->
    <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>
</configuration>

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");
    }
}
相关文章
|
Java 数据库连接 mybatis
Mybatis 处理日期格式自动转换
Mybatis 处理日期格式自动转换
688 0
|
XML Dubbo fastjson
FastJson - 设置默认参数,全局配置方式及爬坑
FastJson - 设置默认参数,全局配置方式及爬坑
2280 0
|
7月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
1158 0
|
2月前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出用户级SQL质量监控功能,集成于CloudLens for SLS,提供健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,助力用户全面掌握SQL使用情况,提升日志分析效率与治理能力。
如何做好SQL质量监控
|
2月前
|
负载均衡 Java 数据安全/隐私保护
Gateway服务网关
本文介绍了微服务架构中API网关的核心作用,包括请求路由、权限控制和限流等功能,重点讲解了Spring Cloud Gateway的快速搭建、路由配置、断言与过滤器工厂的使用,并通过实例演示了全局过滤器、跨域问题解决及过滤器执行顺序等关键技术点。
|
2月前
|
运维 Devops 开发工具
生产环境缺陷管理
git-poison基于go-git实现分布式bug追踪,解决多分支开发中bug漏修、漏发问题。通过“投毒-解毒-银针”机制,自动化卡点发布流程,降低协同成本,提升发布安全性与效率,已在大型团队落地应用。
生产环境缺陷管理
|
2月前
|
JSON Dubbo Java
Feign远程调用
本文介绍如何使用Feign替代RestTemplate实现更优雅的HTTP跨服务调用。通过引入Feign,解决传统方式中服务地址硬编码、代码可读性差等问题。内容涵盖Feign的依赖配置、注解启用、客户端编写及自定义日志、连接池优化等,并提出继承与抽取两种最佳实践方案,推荐将Feign接口抽离为独立模块以提升复用性与维护性,助力微服务间高效通信。
 Feign远程调用
|
2月前
|
负载均衡 算法 架构师
Ribbon负载均衡
本文深入讲解Spring Cloud中Ribbon实现客户端负载均衡的原理,涵盖负载均衡概念、分类、常用算法,详解@LoadBalanced注解作用机制,演示自定义策略与饥饿加载优化,并对比服务端负载均衡,帮助读者全面理解微服务间调用的流量分发技术。
|
2月前
|
JSON 缓存 前端开发
什么是跨域
CORS(跨域资源共享)是W3C标准,允许浏览器向跨源服务器发起XMLHttpRequest请求,突破AJAX同源限制。它分为简单请求与非简单请求,后者需先发送OPTIONS预检请求。整个过程由浏览器自动完成,关键在于服务器需正确配置CORS响应头。相比仅支持GET的JSONP,CORS功能更强大、灵活。
|
Java
java将输入的数字金额转换为中文大写金额
java将输入的数字金额转换为中文大写金额
1443 1