114 lines
5.8 KiB
Markdown
114 lines
5.8 KiB
Markdown
# 日志记录及日志文件分析与建议
|
||
|
||
在目前的 `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` 中定义的 `<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 改造建议):**
|
||
```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`,就能自动隔离日志文件。 |