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

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

时间:2024-12-19 16:56:19浏览次数:6  
标签:文件 traceid LOG 配置文件 30 import 日志

全部配置

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"/>

通过 <property> 定义日志文件的存储路径和文件前缀,便于在不同环境中灵活调整。

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
  • 日志消息清除用户数据

标签:文件,traceid,LOG,配置文件,30,import,日志
From: https://blog.csdn.net/qq_31745863/article/details/144589797

相关文章

  • MySQL的日志机制
    MySQL日志机制随笔(redolog、binlog、undolog)redolog相关作用:保证数据库的恢复能力,数据库崩溃了,能使用redolog恢复数据是什么?redolog是物理日志,记录的是哪个数据页哪个字段被哪个事务改变了,速记:redolog是一种写前日志,先写redolog,等到数据库闲的时候再去写数据库文件redolog是......
  • ELF文件格式
    1ELF定义ELF(ExecutableandLinkableFormat,可执行与可链接格式)是目前UNIX和类UNIX操作系统的标准二进制格式文件。linux系统中的可执行文件(exe)、共享库(.so)、目标文件(.o)、coredump文件都是ELF格式,只是文件类型不同ps:静态共享文件(.a)是目标文件(.o)的集合2EL......
  • Linux权限管理:文件与目录的全面指南
    目录引言一、shell命令以及运行原理二、Linux用户划分三、Linux切换身份与指令提权3.1身份切换3.2指令提权四、Linux文件访问者与文件类型4.1文件访问者4.2文件类型4.2.1Linux工具考虑类型五、Linux文件权限管理5.1文件类型和访问权限5.2文件权限值表示5.......
  • C#使用log4net和sqlite数据库记录日志
    1安装包两个包:log4netSystem.Data.SQLite第二个包也可以使用Microsoft.Data.Sqlite,查到的资料显示如果环境使用的是.NETCore或.NET5+,则建议使用Microsoft.Data.Sqlite。但是我并没有测试第二个包,可能使用上有区别。2下载Sqlite如果本地没有sqlite环境的话,需要先下......
  • 找不到SmartXpButton.ocx文件或SmartXpButton.ocx文件丢失该怎么办?
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个SmartXpButton.ocx文件(挑选合适的版本文件)......
  • 找不到shlobj71.ocx文件或shlobj71.ocx文件丢失该怎么办?
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个shlobj71.ocx文件(挑选合适的版本文件)把它......
  • 15-WAF文件上传绕过、网络后门分析&提权
    1、WAF绕过文件上传实验。利用双写filename=;进行绕过filename=;filename="info.php",成功上传实现绕过(证明WAF和Apache的检测规则+解析逻辑不同)利用无用文件头绕过保留请求数据包原有的格式(在请求头后的空白行和请求正文之间加入大量的无用数据),实现上传绕过......
  • 多个文件通过压缩包下载
    importaxiosfrom"axios";import{saveAs}from"file-saver";importJSZipfrom"jszip";asynchandleDownload(row){letparams={id:row.id,};letfileInfos=awaitthis.getFileInfos(params);......
  • 教你成为学霸第二期——了解C / C++ / Python / Java头文件
      给我一点时间,我可以将你从小白变成资深学霸目录一、C++头文件(一)(二)(三)二、C头文件(一)(二)三、Python模块(类似头文件概念的部分体现)(一)math模块(二)os模块(三)random模块四、Java包(相关但和传统头文件有区别)和导入语句一、C++头文件在C++编程的世界里,头......
  • JavaWeb笔记(项目案例-部门员工管理、文件上传)
    项目环境搭建资料接口文档在Day10三层架构controller:负责接受请求,处理响应service:逻辑处理,为了增强程序灵活性,方便层与层之间解耦,我们会采用面向接口的方式,还需要准备业务层的接口,mapper本身就是一个接口mapper:数据访问操作环境搭建部门实......