# 日志记录及日志文件分析与建议 在目前的 `framework` 框架和 `business-css` 业务模块中,日志系统已经基于 **Logback** 和 **Spring 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-css` 的 `Controller` 层方法上添加 `@Log` 注解。 **代码示例:** ```java 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()` 等方法。 **代码示例:** ```java 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-css` 的 `application-business.yml` 中配置了: ```yaml logging: file: name: logs/business-css.log ``` 这会导致 Spring Boot 覆盖 `logback-spring.xml` 中定义的 `` 标签,但在某些 Spring Boot 版本中,如果不完全结合 `logback-spring.xml`,可能导致滚动策略失效。 **最佳实践建议:** 1. **统一由 Logback 接管**:建议删除 `application-business.yml` 中的 `logging.file.name` 配置。 2. **通过变量传递**:在 `application-business.yml` 中定义自定义属性,或者直接利用 `spring.application.name`。然后在 `logback-spring.xml` 中通过 `` 读取该值,动态决定日志文件名。 **修改示例 (logback-spring.xml 改造建议):** ```xml ${LOG_PATH}/${APP_NAME}.log ${LOG_PATH}/${APP_NAME}.%d{yyyy-MM-dd}.log 30 ``` 这样做能确保日志的按天滚动、文件大小限制等策略完美生效,且不同微服务/模块只要定义好 `spring.application.name`,就能自动隔离日志文件。