Atlas Log 0.2.0 版本

欢迎使用 Atlas Log 0.2.0!本教程将指导您使用最新版本的功能,特别是新修复的注解配置功能。

github.com/nemoob/atla...

📖 目录

🎯 版本亮点

✅ 修复的重要问题

  1. 注解配置 urlFormat 不生效 - 现在完全支持注解级别的 HTTP 日志配置
  2. SensitiveDataMasker 序列化异常 - 优化了敏感数据处理,避免序列化问题
  3. 注解级别格式化器不生效 - 修复了 @Log 注解中格式化器配置问题

🚀 新增功能

  • 完整的 HTTP 日志注解配置支持
  • 改进的配置优先级处理
  • 增强的调试和故障排除功能

🚀 快速开始

1. 添加依赖

xml 复制代码
<dependency>
    <groupId>io.github.nemoob</groupId>
    <artifactId>atlas-log-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>

2. 基础配置

java 复制代码
@SpringBootApplication
@EnableAtlasLog
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3. 验证安装

java 复制代码
@RestController
public class TestController {
    
    @GetMapping("/test")
    @Log("测试接口")
    public String test() {
        return "Atlas Log 0.2.0 工作正常!";
    }
}

📝 注解配置详解

完整注解配置示例

java 复制代码
@SpringBootApplication
@EnableAtlasLog(
    enabled = true,
    defaultLevel = "INFO",
    spelEnabled = true,
    
    // HTTP 日志配置 - 0.2.0 新修复
    httpLog = @AtlasLogHttpLog(
        urlFormat = "{remoteAddr} -> {method} {uri}{queryString}",
        includeQueryString = true,
        logFullParameters = true,
        includeHeaders = false,
        excludeHeaders = {"authorization", "cookie"}
    ),
    
    // 链路追踪配置
    trace = @AtlasLogTrace(
        enabled = true,
        headerName = "X-Trace-Id",
        generator = "uuid"
    ),
    
    // 性能监控配置
    performance = @AtlasLogPerformance(
        enabled = true,
        slowThreshold = 1000L,
        logSlowMethods = true
    ),
    
    // 敏感数据配置
    sensitive = @AtlasLogSensitive(
        enabled = true,
        customFields = {"password", "bankCard", "idCard"}
    )
)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

🌐 HTTP 日志配置

urlFormat 占位符支持

0.2.0 版本完全修复了 urlFormat 配置问题,现在支持以下占位符:

占位符 说明 示例值
{method} HTTP 方法 GET, POST, PUT
{uri} 请求 URI /api/users/123
{queryString} 查询字符串 ?name=john&age=25
{remoteAddr} 客户端 IP 192.168.1.100

配置示例

1. 只显示查询参数

java 复制代码
@EnableAtlasLog(
    httpLog = @AtlasLogHttpLog(
        urlFormat = "{queryString}",
        includeQueryString = true
    )
)

输出效果:

shell 复制代码
# 请求: GET /api/users?id=123&name=john
# 日志: TraceId: xxx | URL: ?id=123&name=john | HTTP请求完成

2. 包含客户端 IP

java 复制代码
@EnableAtlasLog(
    httpLog = @AtlasLogHttpLog(
        urlFormat = "[{remoteAddr}] {method} {uri}"
    )
)

输出效果:

shell 复制代码
# 日志: TraceId: xxx | URL: [192.168.1.100] GET /api/users | HTTP请求完成

3. 完整格式

java 复制代码
@EnableAtlasLog(
    httpLog = @AtlasLogHttpLog(
        urlFormat = "{remoteAddr} -> {method} {uri}{queryString}",
        includeQueryString = true
    )
)

输出效果:

shell 复制代码
# 日志: TraceId: xxx | URL: 192.168.1.100 -> GET /api/users?id=123 | HTTP请求完成

YAML 配置对比

您也可以使用 YAML 配置,但注解配置具有更高优先级:

yaml 复制代码
atlas:
  log:
    http-log:
      url-format: "{method} {uri}{queryString}"
      include-query-string: true
      log-full-parameters: true

🎨 格式化器配置

注解级别格式化器

0.2.0 版本修复了注解级别格式化器不生效的问题:

java 复制代码
@RestController
public class UserController {
    
    // 使用 key-value 格式化器
    @GetMapping("/users")
    @Log(
        value = "查询用户列表",
        logArgs = true,
        argumentFormatter = "key-value"
    )
    public List<User> getUsers(@RequestParam String name, 
                              @RequestParam Integer age) {
        // 输出: arg0=john&arg1=25
        return userService.findUsers(name, age);
    }
    
    // 使用 JSON 格式化器
    @PostMapping("/users")
    @Log(
        value = "创建用户",
        logArgs = true,
        logResult = true,
        argumentFormatter = "json",
        resultFormatter = "json"
    )
    public User createUser(@RequestBody User user) {
        // 参数输出: [{"name":"john","age":25}]
        // 返回值输出: {"id":1,"name":"john","age":25}
        return userService.createUser(user);
    }
    
    // 混合使用格式化器
    @PutMapping("/users/{id}")
    @Log(
        value = "更新用户",
        logArgs = true,
        logResult = true,
        argumentFormatter = "key-value",  // 参数用 key-value
        resultFormatter = "json"          // 返回值用 JSON
    )
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        return userService.updateUser(id, user);
    }
}

自定义格式化器

java 复制代码
@Component
public class CustomArgumentFormatter implements ArgumentFormatter {
    
    @Override
    public String getName() {
        return "custom";
    }
    
    @Override
    public String formatArguments(Object[] args, FormatterContext context) {
        return "[自定义格式] " + Arrays.toString(args);
    }
    
    @Override
    public String formatResult(Object result, FormatterContext context) {
        return "[返回值] " + result;
    }
}

// 使用自定义格式化器
@Log(
    value = "测试自定义格式化器",
    argumentFormatter = "custom",
    resultFormatter = "custom"
)
public String testCustomFormatter(String input) {
    return "processed: " + input;
}

🔍 故障排除

配置验证

添加配置检查器来验证配置是否生效:

java 复制代码
@Component
public class AtlasLogConfigChecker {
    
    @Autowired
    private LogConfigProperties properties;
    
    @PostConstruct
    public void checkConfiguration() {
        System.out.println("=== Atlas Log 0.2.0 Configuration ===");
        
        // 基础配置
        System.out.println("Enabled: " + properties.isEnabled());
        System.out.println("Default Level: " + properties.getDefaultLevel());
        
        // HTTP 日志配置
        LogConfigProperties.HttpLogConfig httpLog = properties.getHttpLog();
        System.out.println("URL Format: " + httpLog.getUrlFormat());
        System.out.println("Include Query String: " + httpLog.isIncludeQueryString());
        System.out.println("Log Full Parameters: " + httpLog.isLogFullParameters());
        
        // 链路追踪配置
        LogConfigProperties.TraceIdConfig trace = properties.getTraceId();
        System.out.println("Trace Enabled: " + trace.isEnabled());
        System.out.println("Trace Header: " + trace.getHeaderName());
        
        System.out.println("=====================================");
    }
}

调试日志

启用调试日志查看详细的配置解析过程:

yaml 复制代码
logging:
  level:
    io.github.nemoob.atlas.log.config: DEBUG
    io.github.nemoob.atlas.log.web.LoggingFilter: DEBUG
    io.github.nemoob.atlas.log.aspect.AtlasLogAspect: DEBUG

常见问题

1. 注解配置不生效

问题 : 配置了 @AtlasLogHttpLog(urlFormat = "{queryString}") 但仍显示默认格式

解决方案:

java 复制代码
// ✅ 正确的配置方式
@EnableAtlasLog(
    httpLog = @AtlasLogHttpLog(
        urlFormat = "{queryString}"
    )
)

// ❌ 错误的配置方式
@AtlasLogHttpLog(urlFormat = "{queryString}")  // 直接在类上使用不会生效

2. 格式化器不生效

问题 : argumentFormatter = "key-value" 配置后仍输出 JSON 格式

解决方案:

  • 确保格式化器名称正确:json, key-value, custom
  • 检查自定义格式化器是否正确注册为 Spring Bean
  • 启用调试日志查看格式化器选择过程

3. YAML 配置覆盖注解配置

问题: YAML 配置覆盖了注解配置

解决方案:

  • 检查 application.yml 中是否有冲突的配置
  • 注解配置应该具有更高优先级,如果被覆盖请检查配置合并逻辑

💡 最佳实践

1. 配置策略

java 复制代码
// 推荐:使用注解配置进行类型安全的配置
@EnableAtlasLog(
    // 基础配置
    enabled = true,
    defaultLevel = "INFO",
    
    // 生产环境建议的 HTTP 日志配置
    httpLog = @AtlasLogHttpLog(
        urlFormat = "{method} {uri}",  // 生产环境不建议记录查询参数
        includeQueryString = false,
        logFullParameters = false,
        includeHeaders = false
    ),
    
    // 开发环境可以更详细
    // httpLog = @AtlasLogHttpLog(
    //     urlFormat = "{remoteAddr} -> {method} {uri}{queryString}",
    //     includeQueryString = true,
    //     logFullParameters = true
    // )
)

2. 格式化器选择

java 复制代码
// 推荐:根据场景选择合适的格式化器
public class BestPracticeController {
    
    // API 接口:使用 JSON 格式便于解析
    @PostMapping("/api/users")
    @Log(
        value = "创建用户 API",
        argumentFormatter = "json",
        resultFormatter = "json"
    )
    public ResponseEntity<User> createUser(@RequestBody User user) {
        return ResponseEntity.ok(userService.create(user));
    }
    
    // 内部方法:使用 key-value 格式便于阅读
    @Log(
        value = "内部用户查询",
        argumentFormatter = "key-value"
    )
    public List<User> findUsers(String name, Integer age, String department) {
        return userService.findUsers(name, age, department);
    }
    
    // 复杂对象:使用自定义格式化器
    @Log(
        value = "复杂业务处理",
        argumentFormatter = "custom",
        resultFormatter = "custom"
    )
    public BusinessResult processComplexBusiness(ComplexRequest request) {
        return businessService.process(request);
    }
}

3. 性能优化

java 复制代码
// 推荐:合理配置性能监控
@EnableAtlasLog(
    performance = @AtlasLogPerformance(
        enabled = true,
        slowThreshold = 1000L,      // 1秒阈值
        logSlowMethods = true
    ),
    
    // 敏感数据处理已优化,可以安全启用
    sensitive = @AtlasLogSensitive(
        enabled = true,
        customFields = {"password", "token", "secret"}
    )
)

4. 环境配置

java 复制代码
// 推荐:使用 Profile 进行环境区分
@Profile("dev")
@Configuration
public class DevLogConfig {
    // 开发环境详细配置
}

@Profile("prod")
@Configuration
public class ProdLogConfig {
    // 生产环境精简配置
}

🎉 总结

Atlas Log 0.2.0 版本修复了重要的配置问题,现在您可以:

  • ✅ 使用注解配置 HTTP 日志格式,包括 urlFormat 占位符
  • ✅ 使用注解级别的格式化器配置
  • ✅ 享受更稳定的敏感数据处理
  • ✅ 获得更好的调试和故障排除体验

立即升级到 0.2.0 版本,体验更强大、更稳定的日志功能!


如有问题,请参考 故障排除文档 或提交 Issue。

相关推荐
快乐肚皮2 小时前
TransmittableThreadLocal:穿透线程边界的上下文传递艺术
java
渣哥2 小时前
别再无脑 synchronized 了!Java 锁优化的 7 个狠招
java
緈諨の約錠3 小时前
JVM基础篇以及JVM内存泄漏诊断与分析
java·jvm
Slaughter信仰3 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)
java·开发语言·jvm
绝无仅有3 小时前
大厂Redis高级面试题与答案
后端·面试·github
Java进阶笔记3 小时前
JVM默认栈大小
java·jvm·后端
绝无仅有3 小时前
面试问题之导致 SQL 查询慢的原因及优化建议
后端·面试·github
shan&cen3 小时前
Day04 前缀和&差分 1109. 航班预订统计 、304. 二维区域和检索 - 矩阵不可变
java·数据结构·算法
在线教学养猪3 小时前
Spring Task
java·后端·spring