springboot增加logback日志记录ip详解

云计算

springboot增加logback日志记录ip详解

2024-11-18 00:30


在 Spring Boot 应用中使用 Logback 记录客户端 IP 地址,可以帮助开发者更好地进行日志分析和故障排查。以下是详细的步骤指导,从导入依赖到配置 Logback,再到代码实现和运行验证,确保您能够顺利完成配置。

                                            




在 Spring Boot 应用中使用 Logback 记录客户端 IP 地址,可以帮助开发者更好地进行日志分析和故障排查。以下是详细的步骤指导,从导入依赖到配置 Logback,再到代码实现和运行验证,确保您能够顺利完成配置。??


?️ 1. 导入 Logback 依赖

Spring Boot 默认集成了 Logback 作为日志记录框架,因此通常无需额外添加依赖项。但如果您需要特定版本或自定义配置,可以在 pom.xml 中确认或添加相关依赖:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>

解释:

  • groupId 和 artifactId 指定了 Logback 的 Maven 坐标。
  • version 确保使用特定版本的 Logback,避免兼容性问题。

2. 创建 logback-spring.xml 文件

在 src/main/resources 目录下创建一个名为 logback-spring.xml 的文件,用于自定义 Logback 的配置。

示例文件结构:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 定义日志文件的路径和名称 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>log/application.log</file>
        <append>true</append>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level %logger{50} - %msg [%X{clientIp}]%n</pattern>
        </encoder>
    </appender>

    <!-- 配置根日志级别和使用的 appender -->
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

解释:

  • appender:定义日志的输出目标,这里使用 FileAppender 将日志写入文件。
  • file:指定日志文件的路径和名称,如 log/application.log
  • pattern:设置日志输出格式,%X{clientIp} 用于记录 MDC 中的 clientIp 变量。
  • root:配置根日志级别为 INFO,并引用上述定义的 FILE appender。

3. 配置 IP 地址记录

通过 Logback 的 MDC(Mapped Diagnostic Context) 功能,将客户端 IP 地址添加到日志中。

XML 配置方式

在 logback-spring.xml 中,已经通过 %X{clientIp} 配置了日志格式,接下来需要在代码中设置 clientIp

编程式配置

如果需要更灵活的配置,可以在代码中动态设置日志格式:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>log/application.log</file>
    <append>true</append>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level %logger{50} - %msg [%X{clientIp}]%n</pattern>
    </encoder>
</appender>

解释:

  • %X{clientIp}:占位符,用于插入 MDC 中名为 clientIp 的值,即客户端 IP 地址。

?️ 4. 在代码中设置 IP 地址

在处理 HTTP 请求的代码中,获取客户端 IP 地址并将其设置到 MDC 中,以便 Logback 能够记录。

示例代码:

import org.slf4j.MDC;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/hello")
    public String hello(HttpServletRequest request) {
        // 获取客户端 IP 地址
        String clientIp = request.getRemoteAddr();
        // 将 IP 地址放入 MDC
        MDC.put("clientIp", clientIp);
        try {
            // 执行业务逻辑
            return "Hello";
        } finally {
            // 移除 MDC 中的 IP 地址,防止内存泄漏
            MDC.remove("clientIp");
        }
    }
}

解释:

  • HttpServletRequest:用于获取客户端的 HTTP 请求信息。
  • request.getRemoteAddr():获取客户端的 IP 地址。
  • MDC.put("clientIp", clientIp):将 IP 地址存入 MDC。
  • MDC.remove("clientIp"):在请求处理完成后,移除 MDC 中的 clientIp,避免影响后续请求。

5. 运行应用程序

完成以上配置后,启动 Spring Boot 应用程序。当您访问 /hello 接口时,日志文件 log/application.log 中将记录包含客户端 IP 地址的日志信息。

示例日志输出:

2024-04-27 10:15:30.123 [http-nio-8080-exec-1] INFO  MyController - Hello [192.168.1.100]

解释:

  • 时间戳2024-04-27 10:15:30.123
  • 线程http-nio-8080-exec-1
  • 日志级别INFO
  • 类名MyController
  • 日志消息Hello
  • 客户端 IP 地址192.168.1.100

6. 常见问题及解决方案

&
标签:
  • springboot
  • logback
  • ip
© 蓝易云.
问题 可能原因 解决方案