5.8 KiB
日志记录及日志文件分析与建议
在目前的 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 注解。
代码示例:
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-css 的 application-business.yml 中配置了:
logging:
file:
name: logs/business-css.log
这会导致 Spring Boot 覆盖 logback-spring.xml 中定义的 <file> 标签,但在某些 Spring Boot 版本中,如果不完全结合 logback-spring.xml,可能导致滚动策略失效。
最佳实践建议:
- 统一由 Logback 接管:建议删除
application-business.yml中的logging.file.name配置。 - 通过变量传递:在
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,就能自动隔离日志文件。