JavaProjectRepo/日志记录及日志文件.md

114 lines
5.8 KiB
Markdown
Raw Normal View History

2026-03-20 19:00:16 +08:00
# 日志记录及日志文件分析与建议
在目前的 `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`,就能自动隔离日志文件。