专属log文件存储 HTTP 请求的真实入参和出参- Spring Boot 日志

我要通过 Spring Boot 在日志当中写很多不同的文件,需要有一个专属的文件去存储 HTTP 请求的真实入参和出参,请帮我撰写 Logback 的 XML 文件。

 

我想想,用户现在需要通过 Spring Boot 在日志中写很多不同的文件,特别是要有一个专属的文件来存储 HTTP 请求的真实入参和出参。他们希望我帮忙撰写 Logback 的 XML 配置文件。首先,我需要回忆一下 Logback 的基本配置结构,以及如何配置多个日志文件。

用户的需求是分开不同的日志到不同的文件,特别是 HTTP 请求的入参和出参需要单独处理。这可能涉及到自定义日志级别或者使用 MDC(Mapped Diagnostic Context)来区分不同的日志类型。不过,用户可能更倾向于使用不同的 Appender 来分别处理不同的日志。

首先,我需要确定如何将 HTTP 请求的日志与其他日志分开。可能的方法是使用 Filter 或者自定义的 Appender。考虑到 Spring Boot 的环境,可能使用 AOP 来拦截 HTTP 请求,记录入参和出参,并将这些日志输出到特定的文件。

接下来,Logback 的配置文件需要定义多个 Appender,每个对应不同的日志文件。例如,一个 Appender 用于普通日志,另一个用于 HTTP 请求日志。然后,通过设置不同的日志级别或者使用 Filter 来决定哪些日志消息被发送到哪个 Appender。

另外,用户可能需要日志格式的自定义,包括时间、日志级别、类名、线程名以及具体的日志信息。特别是 HTTP 请求的日志可能需要包含请求路径、方法、参数、响应状态和返回值等详细信息。

还需要考虑日志文件的滚动策略,比如按天滚动,保留一定天数的日志,避免日志文件过大。Logback 提供了 RollingFileAppender 和 TimeBasedRollingPolicy 来实现这一点。

可能还需要配置日志的根级别,确保所有日志都被处理,同时特定的包或类的日志可以被路由到不同的 Appender。例如,使用<logger>标签来指定某个包的日志使用特定的 Appender。

此外,用户可能希望日志输出到控制台的同时,也写入文件。因此,需要配置 ConsoleAppender 和 FileAppender 的组合。

现在,我需要将这些思考整理成一个具体的 Logback XML 配置文件。首先定义 Appender,包括控制台和两个文件 Appender,一个用于普通日志,另一个用于 HTTP 请求日志。然后配置日志的格式,特别是 HTTP 请求日志的格式需要包含更多的信息。

接下来,设置根 Logger,将日志级别设置为 INFO,并关联到控制台和普通文件 Appender。然后,针对处理 HTTP 请求的包或类,创建一个单独的 Logger,设置其级别为 INFO,并将其添加到 HTTP 请求的 Appender,同时禁止传播到根 Logger,避免重复日志。

最后,测试配置是否正确,确保拦截器或 AOP 能够正确捕获 HTTP 请求,并将日志输出到指定的文件。同时,检查日志滚动策略是否生效,文件是否按预期分割和保留。

可能还需要考虑如何在 Spring Boot 中集成这个配置,确保 Logback 的配置文件被正确加载。通常,将 logback-spring.xml 放在 src/main/resources 目录下即可自动生效。

总结步骤:

  1. 定义多个 Appender,包括控制台、普通日志文件和 HTTP 日志文件。
  2. 配置日志格式,特别是 HTTP 日志的格式。
  3. 设置根 Logger 和特定包的 Logger,关联到对应的 Appender。
  4. 配置日志滚动策略。
  5. 测试配置是否生效。

需要注意的细节包括:

  • 确保 HTTP 日志的 Appender 名称正确,并且在 Logger 中正确引用。
  • 日志格式中的占位符是否正确,特别是 HTTP 请求的详细信息。
  • 日志级别是否合适,避免不必要的日志被记录。
  • 确保 Spring Boot 的日志配置正确,没有与默认配置冲突。

可能还需要提供一个简单的示例,说明如何在 Spring Boot 中使用 AOP 来拦截 HTTP 请求,并记录日志到指定的 Logger。例如,创建一个 @Around 注解的切面,在处理请求前后记录入参和出参,并使用 LoggerFactory.getLogger ("HTTP_REQUEST") 来获取对应的 Logger 实例。

这样,用户就可以将 HTTP 请求的日志独立存储到专属文件中,而其他日志则按常规处理。
以下是一个针对 Spring Boot 项目的 Logback XML 配置方案,实现普通日志与 HTTP 请求日志分离存储:

xml
 
 
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
    <!-- 日志格式模板 -->
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
    <property name="HTTP_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [HTTP] %method %path %status %param %return %n"/>

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

    <!-- 普通日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/springboot/normal.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/var/log/springboot/normal-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- HTTP 日志专用文件 -->
    <appender name="HTTP_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/springboot/http.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/var/log/springboot/http-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${HTTP_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 根日志配置 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>

    <!-- HTTP 日志专用配置 -->
    <logger name="HTTP_REQUEST" level="INFO" additivity="false">
        <appender-ref ref="HTTP_FILE"/>
    </logger>

    <!-- 异步日志处理(可选) -->
    <appender name="ASYNC_HTTP" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="HTTP_FILE"/>
    </appender>
</configuration>
 

使用说明:

  1. 目录结构
    • 创建日志目录:mkdir -p /var/log/springboot
    • 确保应用用户对该目录有写入权限
  2. 日志格式说明
    • %method:请求方法(GET/POST 等)
    • %path:请求路径
    • %status:响应状态码
    • %param:请求参数(需自定义 MDC 填充)
    • %return:响应结果(需自定义 MDC 填充)
  3. Spring Boot 集成
    • 将此文件命名为 logback-spring.xml 放在 src/main/resources 目录
    • 添加日志依赖(通常已包含在 Spring Boot Starter Web 中):
      xml
       
       
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
      </dependency>
       
  4. 拦截器实现(示例)
    java
     
     
    @Component
    public class HttpLoggingInterceptor implements HandlerInterceptor {
        private static final Logger httpLogger = LoggerFactory.getLogger("HTTP_REQUEST");
    
        @Override
        public void afterCompletion(HttpServletRequest request, 
                                  HttpServletResponse response, 
                                  Object handler, 
                                  Exception ex) {
            String params = Stream.of(request.getParameterMap())
                .map(entry -> entry.getKey() + "=" + Arrays.toString(entry.getValue()))
                .collect(Collectors.joining(", "));
            
            String responseBody = "..." // 需通过 Filter 或 ResponseEntity 拦截获取
            
            httpLogger.info("{} {} {} {} {}", 
                request.getMethod(),
                request.getRequestURI(),
                response.getStatus(),
                params,
                responseBody);
        }
    }
     
  5. 高级功能
    • 日志压缩:在 rollingPolicy 中添加 <compressionMode>gzip</compressionMode>
    • 异步日志:启用 ASYNC_HTTP 异步 Appender 提高性能
    • 监控报警:通过 MDC 标记关键请求,配合 ELK 或 Prometheus 进行监控

生产优化建议:

  1. 使用 logback.xml 替代 logback-spring.xml 以避免 Spring 特定功能干扰
  2. 为 HTTP 日志单独配置线程池:
    xml
     
     
    <appender name="ASYNC_HTTP" class="ch.qos.logback.classic.AsyncAppender">
        <queueSize>1024</queueSize>
        <discardingThreshold>0</discardingThreshold>
        <appender-ref ref="HTTP_FILE"/>
    </appender>
     
  3. 敏感信息过滤:在 PatternLayout 中添加 %replace 过滤敏感字段
  4. 容器化部署时挂载日志卷到宿主机

此配置方案可实现:

  • 普通业务日志与 HTTP 请求日志完全分离
  • 自动按天滚动日志文件
  • 独立的日志格式设计
  • 支持异步日志处理
  • 灵活的日志保留策略
posted @ 2025-05-08 14:34  CharyGao  阅读(77)  评论(0)    收藏  举报