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

114 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 日志记录及日志文件分析与建议
在目前的 `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`,就能自动隔离日志文件。