docs(logging): add comprehensive logging operations guide
This commit is contained in:
547
docs/LOGGING_GUIDE.md
Normal file
547
docs/LOGGING_GUIDE.md
Normal file
@@ -0,0 +1,547 @@
|
||||
# ERPAuto 日志查询指南
|
||||
|
||||
## 概述
|
||||
|
||||
> 本指南用于帮助运维和开发人员使用日志系统快速排查问题。
|
||||
>
|
||||
> **P0 升级**:日志系统已增强 requestId 追踪、性能监控、完整错误上下文。
|
||||
|
||||
---
|
||||
|
||||
## 日志字段说明
|
||||
|
||||
### 新增核心字段(P0 升级)
|
||||
|
||||
| 字段 | 类型 | 说明 | 示例 |
|
||||
| --------------- | ------- | ------------------------- | ---------------------------------------- |
|
||||
| `requestId` | string | 请求唯一标识符(UUID v4) | `"f833980c-7b11-4c13-9c39-7c8890eb8b2f"` |
|
||||
| `userId` | string | 执行操作的用户 ID | `"admin"` |
|
||||
| `operation` | string | 操作类型 | `"extract"`, `"clean"`, `"validate"` |
|
||||
| `duration` | number | 操作耗时(毫秒) | `1523` |
|
||||
| `slow` | boolean | 是否为慢操作(> 阈值) | `true` |
|
||||
| `batchId` | string | 批次 ID | `"B20260404-001"` |
|
||||
| `tableName` | string | 数据库表名 | `"DiscreteMaterialPlan"` |
|
||||
| `operationType` | string | 数据库操作类型 | `"INSERT"`, `"DELETE"`, `"UPDATE"` |
|
||||
| `recordCount` | number | 记录数 | `150` |
|
||||
| `fileSize` | number | 文件大小(字节) | `1048576` |
|
||||
|
||||
### 业务上下文字段
|
||||
|
||||
| 字段 | 场景 | 说明 |
|
||||
| ------------------------ | ----------------- | ---------------------------------- |
|
||||
| `orderNumbers` | Extractor/Cleaner | 订单号列表 |
|
||||
| `materialCodes` | Cleaner | 物料代码列表 |
|
||||
| `downloadDir` | Extractor | 下载目录路径 |
|
||||
| `dryRun` | Cleaner | 是否为干运行模式 |
|
||||
| `mode` | Validation | 验证模式(`database_filtered` 等) |
|
||||
| `useSharedProductionIds` | Validation | 是否使用共享 Production ID |
|
||||
| `configPath` | Config | 配置文件路径 |
|
||||
| `isDev` | Config | 是否为开发环境 |
|
||||
| `version` | Update | 应用版本号 |
|
||||
| `channel` | Update | 更新通道(`stable`/`preview`) |
|
||||
|
||||
---
|
||||
|
||||
## 日志查询工具与脚本
|
||||
|
||||
### PowerShell 查询脚本
|
||||
|
||||
#### 1. 按 requestId 追踪完整请求链路
|
||||
|
||||
```powershell
|
||||
# 查找特定 requestId 的所有日志
|
||||
$requestId = "f833980c-7b11-4c13-9c39-7c8890eb8b2f"
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\app-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.requestId -eq $requestId } |
|
||||
Sort-Object timestamp |
|
||||
Format-Table timestamp, level, message, context -AutoSize
|
||||
```
|
||||
|
||||
**用途**:完整追踪一个请求的所有操作
|
||||
|
||||
---
|
||||
|
||||
#### 2. 查找慢操作(> 2 秒)
|
||||
|
||||
```powershell
|
||||
# 查找所有慢操作
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\app-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.duration -gt 2000 } |
|
||||
Format-Table timestamp, operation, duration, message -AutoSize
|
||||
```
|
||||
|
||||
**用途**:识别性能瓶颈
|
||||
|
||||
---
|
||||
|
||||
#### 3. 查找特定用户的所有操作
|
||||
|
||||
```powershell
|
||||
# 按 userId 筛选日志
|
||||
$userId = "admin"
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\app-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.userId -eq $userId } |
|
||||
Sort-Object timestamp |
|
||||
Format-Table timestamp, operation, level, message -AutoSize
|
||||
```
|
||||
|
||||
**用途**:审计用户操作
|
||||
|
||||
---
|
||||
|
||||
#### 4. 查找特定时间段内的错误
|
||||
|
||||
```powershell
|
||||
# 查找最近 1 小时的错误
|
||||
$startTime = (Get-Date).AddHours(-1)
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\error-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { [datetime]::Parse($_.timestamp) -gt $startTime } |
|
||||
Format-Table timestamp, message, error -AutoSize
|
||||
```
|
||||
|
||||
**用途**:故障排查
|
||||
|
||||
---
|
||||
|
||||
#### 5. 按 operation 统计操作频率
|
||||
|
||||
```powershell
|
||||
# 统计各 operation 的执行次数
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\app-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.operation } |
|
||||
Group-Object operation |
|
||||
Sort-Object Count -Descending |
|
||||
Format-Table Name, Count -AutoSize
|
||||
```
|
||||
|
||||
**用途**:了解系统使用情况
|
||||
|
||||
---
|
||||
|
||||
### Linux/Mac Bash 查询
|
||||
|
||||
```bash
|
||||
# 按 requestId 过滤
|
||||
cat app-*.log | jq 'select(.requestId == "f833980c-7b11-4c13-9c39-7c8890eb8b2f")'
|
||||
|
||||
# 查找错误日志
|
||||
cat error-*.log | jq '.'
|
||||
|
||||
# 查找慢操作
|
||||
cat app-*.log | jq 'select(.duration > 2000)'
|
||||
|
||||
# 统计 operation 频率
|
||||
cat app-*.log | jq -r '.operation' | sort | uniq -c | sort -rn
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 常见故障排查场景
|
||||
|
||||
### 场景 1:数据提取失败
|
||||
|
||||
**症状**:用户报告 "提取任务失败"
|
||||
|
||||
**排查步骤**:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[用户报告提取失败] --> B[定位 requestId]
|
||||
B --> C[查看完整请求链路]
|
||||
C --> D{错误类型?}
|
||||
D -->|网络错误 | E[检查 ERP 连接]
|
||||
D -->|数据库错误 | F[检查数据库连接]
|
||||
D -->|文件错误 | G[检查文件权限]
|
||||
E --> H[修复网络问题]
|
||||
F --> H
|
||||
G --> H
|
||||
H --> I[重新执行提取]
|
||||
```
|
||||
|
||||
**日志查询**:
|
||||
|
||||
```powershell
|
||||
# 1. 找到提取相关的错误日志
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\error-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.operation -eq "extract" -and $_.message -like "*失败*" } |
|
||||
Format-List timestamp, requestId, error, orderNumbers
|
||||
```
|
||||
|
||||
**排查要点**:
|
||||
|
||||
1. 查找 `operation: "extract"`的日志
|
||||
2. 提取`requestId`用于全链路追踪
|
||||
3. 检查`error`字段的具体错误信息
|
||||
4. 查看`orderNumbers`确定哪些订单失败
|
||||
|
||||
---
|
||||
|
||||
### 场景 2:物料清理执行缓慢
|
||||
|
||||
**症状**:用户报告 "清理任务太慢"
|
||||
|
||||
**排查步骤**:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[清理缓慢报告] --> B[查找慢操作]
|
||||
B --> C{哪个阶段慢?}
|
||||
C -->|批量处理 | D[检查订单数量/物料数量]
|
||||
C -->|重试操作 | E[检查 ERP 响应时间]
|
||||
C -->|数据库操作 | F[检查数据库性能]
|
||||
D --> G[优化批量大小]
|
||||
E --> G
|
||||
F --> G
|
||||
```
|
||||
|
||||
**日志查询**:
|
||||
|
||||
```powershell
|
||||
# 1. 查找清理相关的慢操作
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\app-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.operation -eq "cleaner" -and $_.duration -gt 5000 } |
|
||||
Format-List timestamp, requestId, duration, slow, totalOrders, totalMaterials
|
||||
```
|
||||
|
||||
**排查要点**:
|
||||
|
||||
1. 查找 `duration > 5000ms` 的清理操作
|
||||
2. 检查`totalOrders`和`totalMaterials` 确认数据量
|
||||
3. 查看 `slow: true` 的批处理日志
|
||||
|
||||
---
|
||||
|
||||
### 场景 3:登录失败
|
||||
|
||||
**症状**:用户无法登录
|
||||
|
||||
**排查步骤**:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[登录失败] --> B[查找认证错误]
|
||||
B --> C{错误类型?}
|
||||
C -->|凭证错误 | D[检查用户名/密码]
|
||||
C -->|ERP 连接错误 | E[检查 ERP 服务状态]
|
||||
C -->|会话错误 | F[检查会话管理]
|
||||
D --> G[修正登录信息]
|
||||
E --> G
|
||||
F --> G
|
||||
```
|
||||
|
||||
**日志查询**:
|
||||
|
||||
```powershell
|
||||
# 1. 查找认证相关的错误
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\error-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.userId -eq "admin" -and $_.message -like "*login*" } |
|
||||
Format-List timestamp, requestId, error, userId, username
|
||||
```
|
||||
|
||||
**排查要点**:
|
||||
|
||||
1. 查找 `operation: "login"`或`message` 包含"login"的日志
|
||||
2. 检查 `userId` 和`username`
|
||||
3. 查看`error`字段的具体错误信息
|
||||
|
||||
---
|
||||
|
||||
### 场景 4:数据库插入失败
|
||||
|
||||
**症状**:数据无法保存到数据库
|
||||
|
||||
**排查步骤**:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[数据库插入失败] --> B[查找数据库错误]
|
||||
B --> C{错误类型?}
|
||||
C -->|连接错误 | D[检查数据库服务]
|
||||
C -->|SQL 语法错误 | E[检查 SQL 语句]
|
||||
C -->|约束错误 | F[检查数据完整性]
|
||||
D --> G[修复数据库问题]
|
||||
E --> G
|
||||
F --> G
|
||||
```
|
||||
|
||||
**日志查询**:
|
||||
|
||||
```powershell
|
||||
# 1. 查找数据库相关的错误
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\error-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.operationType -eq "INSERT" } |
|
||||
Format-List timestamp, requestId, operationType, tableName, error
|
||||
```
|
||||
|
||||
**排查要点**:
|
||||
|
||||
1. 查找 `operationType: "INSERT"`的日志
|
||||
2. 检查`tableName` 确定哪个表失败
|
||||
3. 查看`error`字段的具体错误信息
|
||||
|
||||
---
|
||||
|
||||
### 场景 5:配置文件读取失败
|
||||
|
||||
**症状**:应用启动失败,提示配置错误
|
||||
|
||||
**排查步骤**:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[配置读取失败] --> B[查找配置相关错误]
|
||||
B --> C{错误类型?}
|
||||
C -->|文件不存在 | D[检查配置文件路径]
|
||||
C -->|解析错误 | E[检查 YAML 格式]
|
||||
C -->|验证错误 | F[检查配置字段]
|
||||
D --> G[修复配置问题]
|
||||
E --> G
|
||||
F --> G
|
||||
```
|
||||
|
||||
**日志查询**:
|
||||
|
||||
```powershell
|
||||
# 1. 查找配置相关的错误
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\error-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.configPath } |
|
||||
Format-List timestamp, requestId, configPath, isDev, error
|
||||
```
|
||||
|
||||
**排查要点**:
|
||||
|
||||
1. 查找 `configPath` 字段的日志
|
||||
2. 检查 `isDev` 确定环境(开发/生产)
|
||||
3. 查看`error`字段的具体错误信息
|
||||
|
||||
---
|
||||
|
||||
### 场景 6:文件上传失败
|
||||
|
||||
**症状**:文件无法上传到 RustFS
|
||||
|
||||
**排查步骤**:
|
||||
|
||||
**日志查询**:
|
||||
|
||||
```powershell
|
||||
# 1. 查找上传相关的错误
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\error-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.fileSize -or $_.message -like "*upload*" } |
|
||||
Format-List timestamp, requestId, fileSize, endpoint, bucket, error
|
||||
```
|
||||
|
||||
**排查要点**:
|
||||
|
||||
1. 查找 `fileSize` 字段的日志(表示文件操作)
|
||||
2. 检查 `endpoint`和`bucket` 配置
|
||||
3. 查看`error`字段的具体错误信息
|
||||
|
||||
---
|
||||
|
||||
### 场景 7:验证任务无数据返回
|
||||
|
||||
**症状**:验证任务执行成功但无数据
|
||||
|
||||
**排查步骤**:
|
||||
|
||||
**日志查询**:
|
||||
|
||||
```powershell
|
||||
# 1. 查找验证相关的日志
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\app-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.operation -eq "validate" } |
|
||||
Format-List timestamp, requestId, mode, useSharedProductionIds, recordCount
|
||||
```
|
||||
|
||||
**排查要点**:
|
||||
|
||||
1. 查找 `operation: "validate"`的日志
|
||||
2. 检查 `mode`字段(数据来源)
|
||||
3. 查看`useSharedProductionIds`和`recordCount`
|
||||
|
||||
---
|
||||
|
||||
## 日志最佳实践
|
||||
|
||||
### 1. 开发环境 vs 生产环境
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[日志级别配置] --> B{环境?}
|
||||
B -->|开发 | C[DEBUG 级别<br/>详细信息]
|
||||
B -->|生产 | D[INFO 级别<br/>业务操作]
|
||||
C --> E[调试问题]
|
||||
D --> F[监控运行]
|
||||
```
|
||||
|
||||
**配置示例**:
|
||||
|
||||
```yaml
|
||||
# config.yaml
|
||||
logging:
|
||||
level: debug # 开发环境
|
||||
# level: info # 生产环境
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. 敏感信息保护
|
||||
|
||||
**永远不要记录**:
|
||||
|
||||
- ❌ 密码
|
||||
- ❌ Token/密钥
|
||||
- ❌ 数据库连接字符串
|
||||
- ❌ 用户个人信息
|
||||
|
||||
**正确做法**:
|
||||
|
||||
```typescript
|
||||
// ❌ 错误:记录敏感信息
|
||||
log.error('Login failed', { password: userPassword })
|
||||
|
||||
// ✅ 正确:使用脱敏信息
|
||||
log.error('Login failed', {
|
||||
userId: 'admin',
|
||||
reason: 'invalid_credentials' // 仅记录原因
|
||||
})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. 错误日志应该包含
|
||||
|
||||
**完整上下文**:
|
||||
|
||||
```typescript
|
||||
log.error('Database insert failed', {
|
||||
requestId: getRequestId(), // 自动注入
|
||||
operation: 'insert-materials',
|
||||
userId: 'admin',
|
||||
tableName: 'DiscreteMaterialPlan',
|
||||
recordCount: 150,
|
||||
error: error.message,
|
||||
orderNumbers: ['SO001', 'SO002']
|
||||
})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. 性能监控
|
||||
|
||||
**关键指标**:
|
||||
|
||||
- `duration > 1000ms`:一般警告
|
||||
- `duration > 5000ms`:严重警告
|
||||
- `duration > 10000ms`:需要立即调查
|
||||
|
||||
**监控脚本**:
|
||||
|
||||
```powershell
|
||||
# 每小时生成性能报告
|
||||
Get-Content "C:\Users\pengq\AppData\Roaming\erpauto\logs\app-*.log" |
|
||||
ConvertFrom-Json |
|
||||
Where-Object { $_.duration -gt 1000 } |
|
||||
Group-Object operation |
|
||||
ForEach-Object {
|
||||
[PSCustomObject]@{
|
||||
Operation = $_.Name
|
||||
SlowOperations = $_.Count
|
||||
AvgDuration = [math]::Round(($_.Group | Measure-Object duration -Average).Average, 2)
|
||||
MaxDuration = [math]::Round(($_.Group | Measure-Object duration -Maximum).Maximum, 2)
|
||||
}
|
||||
} | Format-Table -AutoSize
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 日志文件管理
|
||||
|
||||
### 文件位置
|
||||
|
||||
| 环境 | 路径 |
|
||||
| -------- | ------------------------------------------------- |
|
||||
| **开发** | `D:\FileLib\Projects\CodeMigration\ERPAuto\logs\` |
|
||||
| **生产** | `C:\Users\<user>\AppData\Roaming\erpauto\logs\` |
|
||||
|
||||
### 文件命名
|
||||
|
||||
| 类型 | 命名格式 | 说明 |
|
||||
| -------- | ------------------------ | ------------------ |
|
||||
| 应用日志 | `app-YYYY-MM-DD.log` | 所有业务日志 |
|
||||
| 错误日志 | `error-YYYY-MM-DD.log` | 仅错误级别日志 |
|
||||
| 审计日志 | `audit-YYYY-MM-DD.jsonl` | 用户操作审计 |
|
||||
| 压缩归档 | `*.log.gz` | 超过保留期限的日志 |
|
||||
|
||||
### 保留策略
|
||||
|
||||
```yaml
|
||||
# config.yaml
|
||||
logging:
|
||||
appRetention: 14 # 应用日志保留 14 天
|
||||
auditRetention: 30 # 审计日志保留 30 天
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排查流程图
|
||||
|
||||
### 通用排查流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[收到故障报告] --> B[确定故障类型]
|
||||
B --> C{故障类型?}
|
||||
C -->|功能错误 | D[查找相关 error 日志]
|
||||
C -->|性能问题 | E[查找慢操作日志]
|
||||
C -->|数据问题 | F[查找数据操作日志]
|
||||
D --> G[定位 requestId]
|
||||
E --> G
|
||||
F --> G
|
||||
G --> H[追踪完整请求链路]
|
||||
H --> I[分析错误根因]
|
||||
I --> J[制定修复方案]
|
||||
J --> K[执行修复]
|
||||
K --> L[验证修复效果]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 总结
|
||||
|
||||
### 快速参考
|
||||
|
||||
| 需求 | 查询字段 |
|
||||
| ---------- | ------------------------ |
|
||||
| 完整追踪 | `requestId` |
|
||||
| 性能排查 | `duration`, `slow` |
|
||||
| 用户审计 | `userId` |
|
||||
| 错误分析 | `error`, `operationType` |
|
||||
| 数据库问题 | `tableName`, `records` |
|
||||
| 文件问题 | `fileSize`, `filePath` |
|
||||
|
||||
### 联系支持
|
||||
|
||||
如遇日志相关问题,请联系技术支持团队并提供:
|
||||
|
||||
1. 故障时间段
|
||||
2. 相关 `requestId`
|
||||
3. 错误日志内容
|
||||
|
||||
---
|
||||
|
||||
_文档版本:P0 Enhanced Logging_
|
||||
_更新日期:2026-04-04_
|
||||
Reference in New Issue
Block a user