# 日志配置（logback-spring.xml）检查与优化说明

## 一、本次已修复的问题

### 1. Logger 名称尾随空格导致降噪失效（风险）

- **问题**：`DefaultSecurityFilterChain `、`URLConfigurationSource ` 等 logger 名称带尾部空格，与真实类名不一致，降噪配置无法匹配，框架 DEBUG 日志仍会输出。
- **处理**：已去掉上述 logger 名称中的尾部空格，所有模块已统一修正。

### 2. 归档总大小无上限（风险）

- **问题**：仅配置 `maxHistory=30` 和 `maxFileSize=1MB`，单级别理论最大约 30MB，但多服务、多级别同目录时，总磁盘占用不可控，存在写满磁盘风险。
- **处理**：已为所有文件的 `SizeAndTimeBasedRollingPolicy` 增加 **`<totalSizeCap>500MB</totalSizeCap>`**。即每个服务、每个级别（DEBUG/INFO/WARN/ERROR）的归档总大小上限 500MB，单服务四类合计约 2GB 上限。

### 3. alien-dining 注释不统一

- **问题**：`log.maxHistory` 注释为「30个」，与其他模块「保留30个归档」不一致。
- **处理**：已统一为「30表示保留30个归档」。

---

## 二、已识别的风险与建议

### 1. logging.path 默认值为 Windows 路径

- **风险**：`defaultValue="C:/project/ext/log"` 在 Linux 或容器中若未设置 `logging.path`，目录可能不存在或不可写，导致日志写失败或落盘到非预期路径。
- **建议**：
  - 生产/测试环境在 `application.yml` 或环境变量中显式配置 `logging.path`（如 `/var/log/alien-xxx` 或 `./logs`）。
  - 已在 alien-gateway 的 logback 中增加注释提醒，其他模块部署时同样需保证该配置正确。

### 2. ~~alien-dining 控制台为 DEBUG 级别~~（已修复）

- **原风险**：alien-dining 的 CONSOLE 使用 `${log.level}`（debug），控制台会输出 DEBUG，生产易刷屏。
- **处理**：已改为与其它模块一致，CONSOLE 固定为 **INFO**，仅文件仍按级别分 DEBUG/INFO/WARN/ERROR。

### 3. 多实例同目录部署

- **现状**：各服务已写入各自子目录 `LOG_DIR`（如 `logging.path/alien-dining/`），同机多实例若共用同一 `logging.path` 且相同 `FILENAME` 会写同一子目录。
- **建议**：同一台机多实例时，为每个实例配置不同的 `logging.path`（如 `.../log-instance1`）或通过启动参数覆盖 `FILENAME` 以区分。

### 4. logging.path 根目录需存在

- **说明**：Logback 只会自动创建**当前写入文件的父目录**（即 `LOG_DIR` = `logging.path/FILENAME`），不会自动创建 `logging.path` 本身。
- **建议**：部署前确保 `logging.path` 所指目录已存在且有写权限；否则首次写日志会报错。Linux 可设为 `/var/log/xxx` 或 `./logs` 并确保目录存在。

---

## 三、可选优化（未改配置）

| 项目 | 说明 |
|------|------|
| **异步 Appender** | 对写盘量大的服务可将 FILE 包一层 `AsyncAppender`，减轻主线程 IO，需接受异常退出时可能少几条日志。 |
| **按环境区分** | 使用 `<springProfile name="pro">` 等区分开发/生产路径、级别或 totalSizeCap。 |
| **immediateFlush** | 默认 true，设为 false 可减少 IO，换少量丢日志风险，一般保持 true。 |

---

## 四、当前各模块配置要点汇总

| 项目 | 说明 |
|------|------|
| 滚动策略 | SizeAndTimeBasedRollingPolicy，单文件 1MB，按天+序号归档并压缩为 .gz |
| 日志目录 | 各服务写入**各自子目录** `${logging.path}/${FILENAME}/`，如 `C:/project/ext/log/alien-dining/`、`alien-gateway/` 等 |
| 当前写入文件 | `${LOG_DIR}/DEBUG.log`、`INFO.log`、`WARN.log`、`ERROR.log`（LOG_DIR = logging.path/FILENAME） |
| 归档保留 | maxHistory=30 个归档，totalSizeCap=500MB/级别 |
| 启动清理 | cleanHistoryOnStart=true |
| 文件编码 | UTF-8 |
| 降噪 | DefaultSecurityFilterChain、URLConfigurationSource 等已设为 WARN，且 logger 名称已去掉尾空格 |

---

## 五、本次排查已做的修改

- **alien-dining logback**：CONSOLE 由 `${log.level}` 改为固定 **INFO**，与其它模块一致，避免生产控制台 DEBUG 刷屏；并增加 logging.path 部署说明注释。
- **文档**：多实例说明更新为 LOG_DIR 子目录；新增「logging.path 根目录需存在」说明；alien-dining 控制台风险标记为已修复。

## 六、当前剩余隐患与可优化（结论）

| 类型 | 说明 | 建议 |
|------|------|------|
| **部署** | `logging.path` 默认 `C:/project/ext/log`，Linux/容器未配置时可能写失败 | 生产/测试在配置或环境变量中设置 `logging.path`，并确保该目录存在 |
| **部署** | Logback 只自动创建 `LOG_DIR`，不创建 `logging.path` 根目录 | 部署前创建根目录或使用已存在路径（如 `./logs`） |
| **多实例** | 同机多实例若共用同一 `logging.path` 且同服务名会写同一子目录 | 按实例配置不同 `logging.path` 或区分 FILENAME |
| **可选** | 高吞吐服务可考虑 AsyncAppender 减轻主线程 IO | 按需在对应模块为 FILE appender 包一层异步，接受异常退出时可能少几条日志 |
| **可选** | 按环境区分路径/级别（如 pro 用不同 path 或 totalSizeCap） | 使用 `<springProfile name="pro">` 等 |

当前配置已无已知逻辑错误；剩余为部署约定与可选性能优化。
