JavaProjectRepo/日志记录及日志文件.md
2026-03-20 19:00:16 +08:00

5.8 KiB
Raw Blame History

日志记录及日志文件分析与建议

在目前的 framework 框架和 business-css 业务模块中,日志系统已经基于 LogbackSpring AOP 搭建了良好的基础。为了在 business-css 模块中更好地使用日志并规范输出,以下是综合分析与具体建议:

1. 当前日志架构分析

1.1 日志框架与配置

  • 底层框架: 使用的是 Spring Boot 默认的 Logback。
  • 配置文件: 位于 framework/src/main/resources/logback-spring.xml
  • 输出策略:
    • 控制台 (CONSOLE): 强制使用 UTF-8 编码,包含时间、线程、级别、类名和消息。
    • 文件 (FILE): 采用按天滚动的策略 (TimeBasedRollingPolicy),最多保留 30 天的历史日志。
  • 配置文件覆盖: 在 business-css/src/main/resources/application-business.yml 中,通过 logging.file.name: logs/business-css.log 重写了日志文件的路径和名称。这意味着启动 business-css 模块时,日志会自动写入该文件。

1.2 业务操作日志 (AOP 切面)

  • 注解支持: framework 中提供了自定义注解 @com.yfd.platform.annotation.Log(value="操作描述", module="所属模块")
  • 切面拦截: LogAspect.java 会拦截带有该注解的方法自动提取请求信息IP、浏览器、操作人等以及方法执行的耗时和结果并调用 ISysLogService 将这些操作日志持久化到数据库中。

2. 针对 business-css 模块的实施建议

为了在 business-css 模块中实现规范、高效的日志记录,建议从以下两个维度(系统运行日志用户操作日志)入手:

2.1 用户操作日志 (入库) —— 针对 Controller 层

对于需要审计、追踪用户行为的核心业务接口(如增删改操作),应直接复用框架提供的 @Log 注解。

实施方法:business-cssController 层方法上添加 @Log 注解。

代码示例:

import com.yfd.platform.annotation.Log;

@RestController
@RequestMapping("/project")
public class ProjectController {

    @Log(value = "新增仿真项目", module = "项目管理")
    @PostMapping
    public ResponseResult addProject(@RequestBody Project project) {
        // 业务逻辑...
        return ResponseResult.success();
    }
}

效果:用户的操作会被自动拦截并写入数据库的系统日志表中,方便后台管理界面的“日志管理”模块进行展示和审计。

2.2 系统运行与调试日志 (写文件) —— 针对 Service / 核心逻辑层

对于系统内部的运行状态、复杂计算过程如仿真计算、模型推理等以及异常捕获应该使用标准的日志框架SLF4J打印日志以便于排查 Bug。

实施方法: 在需要打印日志的类上使用 Lombok 的 @Slf4j 注解,然后使用 log.info(), log.error() 等方法。

代码示例:

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class SimInferServiceImpl implements SimInferService {

    public void asyncInferAndSave(...) {
        log.info("开始执行异步推理任务, scenarioId: {}", scenarioId);
        try {
            // 复杂的推理逻辑...
            log.debug("中间计算状态: {}", someState);
        } catch (Exception e) {
            // 记录异常堆栈,这会被输出到 logs/business-css.log 中
            log.error("异步推理失败, scenarioId: {}, 原因: {}", scenarioId, e.getMessage(), e);
        }
    }
}

2.3 异常日志的统一处理

目前的 GlobalExceptionHandler 已经能够拦截未处理的异常并使用 log.error() 打印。 建议:在 business-css 模块抛出自定义业务异常(如 BizException)时,确保全局异常处理器能合理地记录(通常业务异常记为 WARN 即可,系统级异常记为 ERROR)。目前 GlobalExceptionHandler 统一按 ERROR 记录了所有 Throwable,这会导致日志文件中充斥着正常的业务校验阻断信息,建议后续对异常进行分类处理。


3. 日志文件输出管理建议

目前 business-cssapplication-business.yml 中配置了:

logging:
  file:
    name: logs/business-css.log

这会导致 Spring Boot 覆盖 logback-spring.xml 中定义的 <file> 标签,但在某些 Spring Boot 版本中,如果不完全结合 logback-spring.xml,可能导致滚动策略失效。

最佳实践建议:

  1. 统一由 Logback 接管:建议删除 application-business.yml 中的 logging.file.name 配置。
  2. 通过变量传递:在 application-business.yml 中定义自定义属性,或者直接利用 spring.application.name。然后在 logback-spring.xml 中通过 <springProperty> 读取该值,动态决定日志文件名。

修改示例 (logback-spring.xml 改造建议)

<configuration>
    <!-- 从 yml 读取应用名称,默认为 platform -->
    <springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="platform"/>
    <property name="LOG_PATH" value="logs"/>
    
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 这样启动 business-css 时,日志就会是 logs/business-css.log -->
        <file>${LOG_PATH}/${APP_NAME}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${APP_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>
</configuration>

这样做能确保日志的按天滚动、文件大小限制等策略完美生效,且不同微服务/模块只要定义好 spring.application.name,就能自动隔离日志文件。