Springboot logback 日志打印配置文件,每个日志文件100M,之后滚动到下一个日志文件,日志保留30天(包含traceid)

全部配置

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <property name="LOG_HOME" value="log"/>
    <property name="LOG_NAME" value="admin"/>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) [%X{traceid}] %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="FILE_LOG_PATTERN"
              value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} [%X{traceid}] ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
    <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
    <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
    <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
    <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
    <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
    <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/${LOG_NAME}-info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxFileSize>100MB</MaxFileSize>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/${LOG_NAME}-error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxFileSize>100MB</MaxFileSize>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="FILE"/>
        <appender-ref ref="FILE_ERROR"/>
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

2. 定义日志参数

<property name="LOG_HOME" value="log"/>
<property name="LOG_NAME" value="admin"/>
  • LOG_HOME: 日志打印存放在服务器的位置
  • LOG_NAME: 日志文件名称(用于区分项目)
    • 如admin,文件名为admin-info.2024-12-17.0.log和admin-error.2024-12-17.0.log

3. 日志格式

<property name="CONSOLE_LOG_PATTERN"
  value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) [%X{traceid}] %clr(%t){cyan} %clr(:){faint} %m%n"/>
<property name="FILE_LOG_PATTERN"
  value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%X{traceid}] %t : %m%n"/>

控制台和文件的日志输出格式分别定义,确保输出内容既清晰又易读。格式化内容包括:

  • %d{}
    • 格式:%d{yyyy-MM-dd HH:mm:ss.SSS}
    • 含义:记录日志的时间戳,格式化为 年-月-日 小时:分钟:秒.毫秒
    • 动态属性:${LOG_DATEFORMAT_PATTERN},支持配置化日期格式,默认为 yyyy-MM-dd HH:mm:ss.SSS
  • %clr()
    • 含义:为控制台输出添加颜色区分。{faint}, {magenta}, {cyan} 等指定不同的颜色样式。
    • 例如:%clr(${PID:- }){magenta} 用洋红色显示进程 ID。
  • %5p
    • 含义:显示日志级别(如 INFO、ERROR)。%5p 表示固定宽度为 5 个字符,右对齐。
  • [%X{traceid}]
    • 含义:显示上下文变量 traceid 的值。
    • 用法:通过 MDC.put("traceid", "value") 在日志记录中注入 traceid
  • %t%15.15t
    • 含义:显示线程名称。
    • %15.15t 表示线程名称固定宽度为 15 个字符,超出部分会截断。
  • %-40.40logger{39}
    • 含义:记录日志的类名,显示宽度范围为 40 个字符。
    • {39} 指定类名路径最大为 39 层。
  • %m%n
    • %m:日志消息内容。
    • %n:换行符。
  • ${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
    • 含义:异常栈信息的格式化输出,默认为 Logback 的 WhitespaceThrowableProxyConverter
3.1 生成traceid
import com.applets.manager.core.constant.Constants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;

/**
 * @author zr
 */
@Component
@Slf4j
@Order(1)
public class TraceFilter extends OncePerRequestFilter {


    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        MDC.put(Constants.TRACE_ID, this.getTraceId(request));
        filterChain.doFilter(request, response);
    }

    private String getTraceId(HttpServletRequest request) {
        String traceId = request.getHeader(Constants.TRACE_ID);
        if (StringUtils.isEmpty(traceId)) {
            traceId = UUID.randomUUID().toString();
        }
        return traceId;
    }
}

public class Constants {

    public static final String TRACE_ID = "traceid";

    /**
     * 构造函数私有化,避免被实例化
     */
    private Constants() {
    }


}

4. 日志级别与输出

<root level="INFO">
  <appender-ref ref="FILE"/>
  <appender-ref ref="FILE_ERROR"/>
  <appender-ref ref="STDOUT"/>
</root>

根日志记录器设置为 INFO 级别,并将日志分别输出到文件和控制台:

  • STDOUT: 控制台输出,方便开发时实时查看。
  • FILE: 记录 INFO 及以上级别的日志到文件。
  • FILE_ERROR: 专门记录 ERROR 级别日志,便于快速定位严重问题。

5. 文件滚动策略

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  <FileNamePattern>${LOG_HOME}/${LOG_NAME}-info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
  <MaxFileSize>100MB</MaxFileSize>
  <MaxHistory>30</MaxHistory>
</rollingPolicy>
  • MaxFileSize:表示单个日志文件的最大大小。当日志文件达到 100MB 时,它将被滚动,生成一个新的文件。这个参数确保日志文件不会因为过大而占用过多的磁盘空间,避免出现性能问题。
  • MaxHistory:表示保留的最大日志历史天数。这里设置为 30,意味着系统会保留过去 30 天的日志文件。超过 30 天的日志文件将被自动删除,从而节省存储空间。这个设置防止了日志文件积累过多,确保只有最近的日志会被保存。

6. 实际日志实例

2024-12-19 16:31:44.222  INFO [39a89345-5f86-4ddd-9d68-96ae5cffd126] 15763 --- [http-nio-8081-exec-2] c.v.manager.api.filter.TraceFilter       : 清除用户数据
  • 时间戳2024-12-19 16:31:44.222
  • 日志级别INFO
  • traceid39a89345-5f86-4ddd-9d68-96ae5cffd126
  • 进程 ID15763
  • 线程名称http-nio-8081-exec-2
  • 日志类路径c.v.manager.api.filter.TraceFilter
  • 日志消息清除用户数据
<think>好的,用户问的是如何在Spring Boot中配置多个日志文件。我需要先回忆一下Spring Boot日志配置方式,特别是关于多日志文件的部分。 首先,Spring Boot默认使用Logback作为日志框架,所以配置多日志文件应该通过Logback配置文件来实现。用户提到的application.properties中的配置可能只能设置单个日志文件,但想要多个的话,可能需要自定义logback-spring.xml。 然后,我得考虑用户的需求。他们可能希望不同的日志信息输出到不同的文件里,比如按日志级别或者按模块分开。这时候需要在Logback里配置多个appender,每个appender指向不同的文件,并且设置不同的日志规则。 接下来,示例代码部分需要展示如何编写logback-spring.xml,定义多个文件appender,并分配给不同的logger。比如,一个记录info级别到app.log,另一个记录error到error.log,或者按包名区分。 还要注意是否需要引用Spring Boot的默认配置,或者覆盖默认设置。可能需要包含<include resource="org/springframework/boot/logging/logback/defaults.xml"/>来保留Spring Boot的默认配置,比如控制台输出。 另外,用户可能希望看到如何在不同的环境中使用不同的日志配置,比如通过Spring Profile来切换。不过用户的问题主要集中在多文件,所以可能暂时不需要涉及Profile部分。 最后,要确保示例中的路径和文件名正确,比如使用${LOG_PATH}和${LOG_FILE}这样的变量,或者在配置中直接指定路径。同时,提醒用户需要在application.properties中设置logging.file.path或logging.file.name,但多文件配置主要还是依赖logback的配置。 检查是否有遗漏,比如RollingPolicy是否配置正确,避免日志文件过大。同时,生成的相关问题要考虑用户可能的后续疑问,比如如何按模块分日志,如何设置不同级别,以及性能影响等。</think>以下是如何在Spring Boot中配置多个日志文件的详细实现方案: ### 一、配置原理 Spring Boot通过Logback实现日志管理,多日志文件需要自定义`logback-spring.xml`配置文件,通过定义多个`appender`实现分流[^2][^3]。 ### 二、具体实现步骤 1. **创建配置文件** 在`src/main/resources`目录下新建`logback-spring.xml` 2. **配置多文件输出示例** ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <!--日志文件 --> <appender name="MAIN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/application.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>50MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 错误日志文件 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/error.log</file> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>50MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 控制台输出 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5level) %clr(${PID:- }){magenta} [%15.15thread] %clr(%-40.40logger{39}){cyan} : %msg%n</pattern> </encoder> </appender> <!-- 日志分配策略 --> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="MAIN_FILE"/> <appender-ref ref="ERROR_FILE"/> </root> </configuration> ``` 3. **application.properties配置** ```properties # 设置日志存储目录 logging.file.path=/var/log/myapp # 启用自定义配置 logging.config=classpath:logback-spring.xml ``` ### 三、验证配置 ```java @RestController public class LogDemoController { private static final Logger logger = LoggerFactory.getLogger(LogDemoController.class); @GetMapping("/test") public String test() { logger.info("This goes to application.log"); logger.error("This goes to error.log"); return "Check log files"; } } ``` ### 四、配置说明 1. **文件分割策略**:采用`SizeAndTimeBasedRollingPolicy`实现按日期和大小滚动 2. **日志分级存储**:通过`ThresholdFilter`实现ERROR级别单独存储 3. **保留策略**:`maxHistory=30`表示保留30日志[^3] 4. **性能优化**:异步写入可通过`AsyncAppender`实现(需额外配置)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值