# testLog **Repository Path**: MoBinMing/testLog ## Basic Information - **Project Name**: testLog - **Description**: 接入`continew-starter-log-interceptor` - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-12-06 - **Last Updated**: 2024-12-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 日志模块:接入continew-starter-log-interceptor 基于拦截器(Interceptor) ## 简介 接入continew-starter-log-interceptor, `continew-starter-log-interceptor` 是 ContiNew Starter 日志模块基于拦截器(Interceptor)的实现,是针对 Spring Boot Actuator 项目 HttpExchange(原 HttpTrace)的二开增强处理实现。 ```xml top.continew continew-starter-log-interceptor 2.7.4 ``` ## 主要特性 - 支持配置记录的 HTTP 请求日志内容(请求头、请求体、请求参数、IP 归属地、浏览器、操作系统、响应头、响应体、响应参数) - 支持启用控制台 HTTP 日志输出,不记录日志的接口也支持开启打印访问日志(类似于 Nginx access log) - 支持配置放行路由,不进行日志拦截 - 支持将日志数据保存到任何数据源 - 辅助 Spring Doc 可以实现操作日志记录 ## 配置示例 详情请查看: - `top.continew.starter.log.interceptor.autoconfigure.LogProperties` 配置类。 - `top.continew.starter.web.autoconfigure.trace` 配置类。 ```yaml ### application.yaml ### 日志配置 continew-starter: log: enabled: true # 是否打印日志,开启后可打印访问日志(类似于 Nginx access log) is-print: false # 包含信息(默认记录请求头、请求参数、响应头、响应参数) includes: - DESCRIPTION - MODULE - REQUEST_HEADERS - REQUEST_BODY - IP_ADDRESS - BROWSER - OS - RESPONSE_HEADERS - RESPONSE_BODY web: trace: enabled: true trace-id-name: traceId ## TLog 配置 tlog: enable-invoke-time-print: false pattern: '[$spanId][$traceId]' mdc-enable: false ``` 除了必然记录的请求方式、请求 URL 等信息外,其他记录信息支持灵活配置组合,默认记录请求头、请求参数、响应头、响应参数。 ## 添加配置类 将自行实现的日志持久层 bean 注入到 Spring 容器中。 ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import top.continew.starter.log.core.dao.LogDao; import top.continew.starter.log.interceptor.autoconfigure.ConditionalOnEnabledLog; /** * 日志配置 * * @author Charles7c * @since 2022/12/24 23:15 */ @Configuration @ConditionalOnEnabledLog public class LogConfiguration{ /** * 日志持久层接口本地实现类 */ @Bean public LogDao logDao() { return new LogDaoLocalImpl(); } } ``` ## 保存日志 通过实现 `top.continew.starter.log.core.dao.LogDao` 日志持久层接口,重写 add 方法可以实现保存日志记录到任何指定数据源。 ```java import lombok.NoArgsConstructor; import org.springframework.scheduling.annotation.Async; import top.continew.starter.log.core.dao.LogDao; import top.continew.starter.log.core.model.LogRecord; /** * 日志持久层接口本地实现类 * * @author Charles7c * @since 2023/12/16 23:55 */ @NoArgsConstructor public class LogDaoLocalImpl implements LogDao { @Async @Override public void add(LogRecord logRecord) { System.out.println("执行了"); } } ``` ## 局部配置 通过 `@Log` 注解,可以针对单个接口或类进行日志记录,支持灵活配置包含信息、排除信息、是否忽略日志记录。 详情请查看:`top.continew.starter.log.core.annotation` 注解。 辅助 Spring Doc 辅助 Spring Doc 可以实现操作日志记录功能,简单来说就是通过识别 Spring Doc 注解配置来记录日志的模块、行为信息。当然 `@Log` 注解配置优先级更高。 配置模块信息: - @Tag(name = "部门管理") -> 部门管理 - @Log(module = "部门管理") -> 部门管理 配置行为信息: - @Operation(summary="新增部门") -> 新增部门 - @Log("新增部门") -> 新增部门 ```java import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import top.continew.starter.log.core.annotation.Log; @RestController @RequestMapping("user/") @Tag(name = "用户账户登录") @Log(module = "LoginController") public class LogController { @GetMapping("log") @Log("访问了日志模块") public String log(){ return "ok"; } } ``` ## 注意事项 1. **检查项目内的配置类** - 确保配置类不存在继承了 `WebMvcConfigurationSupport` 的类,因为这可能会导致拦截器失效。 - 如果你发现需要自定义 `WebMvcConfigurer` 的某些功能,但又不想影响到默认配置(例如拦截器),你可以让配置类实现 `WebMvcConfigurer` 接口而不是继承 `WebMvcConfigurationSupport` 类。这样既能添加自定义配置,又不会覆盖 Spring Boot 的默认设置。 ```java // 正确的做法:实现 WebMvcConfigurer 接口 @Configuration public class WebConfig implements WebMvcConfigurer { // 自定义配置方法 } ``` 2. **检查项目内的配置类** - 确保配置类不存在如下Bean,因为框架内已经有这个Bean,这可能会导致启动程序失效。 ```java @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() ``` 处理方式(二选一) 1:注释该Bean 2:启动类排除@SpringBootApplication(exclude = {JacksonAutoConfiguration.class}) ```java import top.continew.starter.json.jackson.autoconfigure.JacksonAutoConfiguration; @SpringBootApplication(exclude = {JacksonAutoConfiguration.class}) public class XxxApplication { } ```