change log
This commit is contained in:
344
docs/按级别分文件日志系统说明.md
Normal file
344
docs/按级别分文件日志系统说明.md
Normal file
@@ -0,0 +1,344 @@
|
||||
# 📝 按级别分文件日志系统说明
|
||||
|
||||
## 概述
|
||||
|
||||
本系统支持按日志级别分文件存储,不同级别的日志写入不同的文件,便于日志管理和分析。
|
||||
|
||||
## 功能特性
|
||||
|
||||
### ✅ 按级别分文件
|
||||
- **Debug级别**: `debug.log` - 调试信息
|
||||
- **Info级别**: `info.log` - 一般信息
|
||||
- **Warn级别**: `warn.log` - 警告信息
|
||||
- **Error级别**: `error.log` - 错误信息
|
||||
- **Fatal级别**: `fatal.log` - 致命错误
|
||||
- **Panic级别**: `panic.log` - 恐慌错误
|
||||
|
||||
### ✅ 独立配置
|
||||
- 每个级别可以独立配置文件大小、备份数量、保留天数
|
||||
- 支持不同级别的压缩策略
|
||||
- 灵活的轮转配置
|
||||
|
||||
### ✅ 按日分包支持
|
||||
- 支持按日期分包:`logs/2024-01-01/error.log`
|
||||
- 传统模式:`logs/error.log`
|
||||
|
||||
## 配置说明
|
||||
|
||||
### 基础配置
|
||||
|
||||
```yaml
|
||||
logger:
|
||||
# 基础配置
|
||||
level: info
|
||||
format: json
|
||||
output: "file"
|
||||
log_dir: "/app/logs"
|
||||
use_daily: true
|
||||
|
||||
# 启用按级别分文件
|
||||
enable_level_separation: true
|
||||
|
||||
# 各级别配置
|
||||
level_configs:
|
||||
debug:
|
||||
max_size: 50 # 50MB
|
||||
max_backups: 3
|
||||
max_age: 7 # 7天
|
||||
compress: true
|
||||
info:
|
||||
max_size: 100 # 100MB
|
||||
max_backups: 5
|
||||
max_age: 30 # 30天
|
||||
compress: true
|
||||
warn:
|
||||
max_size: 100 # 100MB
|
||||
max_backups: 5
|
||||
max_age: 30 # 30天
|
||||
compress: true
|
||||
error:
|
||||
max_size: 200 # 200MB
|
||||
max_backups: 10
|
||||
max_age: 90 # 90天
|
||||
compress: true
|
||||
fatal:
|
||||
max_size: 100 # 100MB
|
||||
max_backups: 10
|
||||
max_age: 365 # 1年
|
||||
compress: true
|
||||
panic:
|
||||
max_size: 100 # 100MB
|
||||
max_backups: 10
|
||||
max_age: 365 # 1年
|
||||
compress: true
|
||||
```
|
||||
|
||||
## 日志目录结构
|
||||
|
||||
### 按日分包模式
|
||||
```
|
||||
logs/
|
||||
├── 2024-01-01/
|
||||
│ ├── debug.log # 调试日志
|
||||
│ ├── debug.log.1 # 调试日志备份
|
||||
│ ├── info.log # 信息日志
|
||||
│ ├── info.log.1 # 信息日志备份
|
||||
│ ├── warn.log # 警告日志
|
||||
│ ├── warn.log.1 # 警告日志备份
|
||||
│ ├── error.log # 错误日志
|
||||
│ ├── error.log.1 # 错误日志备份
|
||||
│ ├── fatal.log # 致命错误日志
|
||||
│ └── panic.log # 恐慌错误日志
|
||||
├── 2024-01-02/
|
||||
│ ├── debug.log
|
||||
│ ├── info.log
|
||||
│ ├── warn.log
|
||||
│ ├── error.log
|
||||
│ ├── fatal.log
|
||||
│ └── panic.log
|
||||
```
|
||||
|
||||
### 传统模式
|
||||
```
|
||||
logs/
|
||||
├── debug.log # 调试日志
|
||||
├── debug.log.1 # 调试日志备份
|
||||
├── info.log # 信息日志
|
||||
├── info.log.1 # 信息日志备份
|
||||
├── warn.log # 警告日志
|
||||
├── warn.log.1 # 警告日志备份
|
||||
├── error.log # 错误日志
|
||||
├── error.log.1 # 错误日志备份
|
||||
├── fatal.log # 致命错误日志
|
||||
└── panic.log # 恐慌错误日志
|
||||
```
|
||||
|
||||
## 级别配置策略
|
||||
|
||||
### 1. Debug级别
|
||||
- **用途**: 详细的调试信息
|
||||
- **保留策略**: 短期保留(7天)
|
||||
- **文件大小**: 较小(50MB)
|
||||
- **备份数量**: 较少(3个)
|
||||
|
||||
### 2. Info级别
|
||||
- **用途**: 一般业务信息
|
||||
- **保留策略**: 中期保留(30天)
|
||||
- **文件大小**: 中等(100MB)
|
||||
- **备份数量**: 中等(5个)
|
||||
|
||||
### 3. Warn级别
|
||||
- **用途**: 警告信息
|
||||
- **保留策略**: 中期保留(30天)
|
||||
- **文件大小**: 中等(100MB)
|
||||
- **备份数量**: 中等(5个)
|
||||
|
||||
### 4. Error级别
|
||||
- **用途**: 错误信息
|
||||
- **保留策略**: 长期保留(90天)
|
||||
- **文件大小**: 较大(200MB)
|
||||
- **备份数量**: 较多(10个)
|
||||
|
||||
### 5. Fatal级别
|
||||
- **用途**: 致命错误
|
||||
- **保留策略**: 永久保留(1年)
|
||||
- **文件大小**: 中等(100MB)
|
||||
- **备份数量**: 较多(10个)
|
||||
|
||||
### 6. Panic级别
|
||||
- **用途**: 恐慌错误
|
||||
- **保留策略**: 永久保留(1年)
|
||||
- **文件大小**: 中等(100MB)
|
||||
- **备份数量**: 较多(10个)
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 1. 基本使用
|
||||
|
||||
```go
|
||||
import "tyapi-server/internal/shared/logger"
|
||||
|
||||
// 获取日志器
|
||||
log := logger.GetLogger()
|
||||
|
||||
// 不同级别的日志会自动写入对应文件
|
||||
log.Debug("调试信息", zap.String("component", "user_service"))
|
||||
log.Info("用户登录成功", zap.String("user_id", "12345"))
|
||||
log.Warn("用户多次登录失败", zap.String("phone", "138****8888"))
|
||||
log.Error("数据库连接失败", zap.Error(err))
|
||||
log.Fatal("系统无法启动", zap.Error(err))
|
||||
log.Panic("严重错误", zap.Error(err))
|
||||
```
|
||||
|
||||
### 2. 带上下文的日志
|
||||
|
||||
```go
|
||||
// 从Gin上下文获取日志器
|
||||
ctx := c.Request.Context()
|
||||
log := logger.GetLogger().WithContext(ctx)
|
||||
|
||||
log.Info("处理用户请求",
|
||||
zap.String("action", "user_login"),
|
||||
zap.String("ip", c.ClientIP()),
|
||||
)
|
||||
```
|
||||
|
||||
### 3. 结构化日志字段
|
||||
|
||||
```go
|
||||
log.Info("业务操作",
|
||||
zap.String("operation", "create_user"),
|
||||
zap.String("user_id", user.ID),
|
||||
zap.Int("age", user.Age),
|
||||
zap.Float64("score", 95.5),
|
||||
zap.Bool("is_active", true),
|
||||
zap.Error(err),
|
||||
)
|
||||
```
|
||||
|
||||
## 日志分析
|
||||
|
||||
### 1. 查看特定级别日志
|
||||
|
||||
```bash
|
||||
# 查看错误日志
|
||||
tail -f logs/2024-01-01/error.log
|
||||
|
||||
# 查看警告日志
|
||||
tail -f logs/2024-01-01/warn.log
|
||||
|
||||
# 查看信息日志
|
||||
tail -f logs/2024-01-01/info.log
|
||||
```
|
||||
|
||||
### 2. 统计各级别日志数量
|
||||
|
||||
```bash
|
||||
# 统计错误日志数量
|
||||
wc -l logs/2024-01-01/error.log
|
||||
|
||||
# 统计警告日志数量
|
||||
wc -l logs/2024-01-01/warn.log
|
||||
|
||||
# 统计信息日志数量
|
||||
wc -l logs/2024-01-01/info.log
|
||||
```
|
||||
|
||||
### 3. 搜索特定内容
|
||||
|
||||
```bash
|
||||
# 在错误日志中搜索特定错误
|
||||
grep "数据库连接失败" logs/2024-01-01/error.log
|
||||
|
||||
# 在警告日志中搜索特定警告
|
||||
grep "用户多次登录失败" logs/2024-01-01/warn.log
|
||||
|
||||
# 在信息日志中搜索特定操作
|
||||
grep "用户登录成功" logs/2024-01-01/info.log
|
||||
```
|
||||
|
||||
### 4. 使用jq分析JSON日志
|
||||
|
||||
```bash
|
||||
# 分析错误日志
|
||||
cat logs/2024-01-01/error.log | jq 'select(.level == "error")'
|
||||
|
||||
# 统计错误类型
|
||||
cat logs/2024-01-01/error.log | jq -r '.message' | sort | uniq -c
|
||||
|
||||
# 查看特定用户的错误
|
||||
cat logs/2024-01-01/error.log | jq 'select(.user_id == "12345")'
|
||||
```
|
||||
|
||||
## 监控和告警
|
||||
|
||||
### 1. 错误日志监控
|
||||
|
||||
```bash
|
||||
# 监控错误日志增长
|
||||
watch -n 5 'wc -l logs/$(date +%Y-%m-%d)/error.log'
|
||||
|
||||
# 监控错误日志大小
|
||||
watch -n 5 'ls -lh logs/$(date +%Y-%m-%d)/error.log'
|
||||
```
|
||||
|
||||
### 2. 告警配置
|
||||
|
||||
```bash
|
||||
# 检查错误日志是否超过阈值
|
||||
if [ $(wc -l < logs/$(date +%Y-%m-%d)/error.log) -gt 1000 ]; then
|
||||
echo "错误日志数量过多,请检查系统状态"
|
||||
fi
|
||||
|
||||
# 检查错误日志文件大小
|
||||
if [ $(stat -c%s logs/$(date +%Y-%m-%d)/error.log) -gt 104857600 ]; then
|
||||
echo "错误日志文件过大,请检查系统状态"
|
||||
fi
|
||||
```
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 1. 异步写入
|
||||
- 日志写入是异步的,不会阻塞业务逻辑
|
||||
- 使用缓冲写入减少I/O操作
|
||||
|
||||
### 2. 级别过滤
|
||||
- 只记录配置的级别及以上级别的日志
|
||||
- 减少不必要的日志输出
|
||||
|
||||
### 3. 文件轮转
|
||||
- 自动轮转避免单个文件过大
|
||||
- 压缩旧日志文件节省磁盘空间
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 级别使用规范
|
||||
|
||||
- **Debug**: 详细的调试信息(开发环境)
|
||||
- **Info**: 重要的业务信息(生产环境)
|
||||
- **Warn**: 需要关注但不影响主功能的问题
|
||||
- **Error**: 影响功能的错误信息
|
||||
- **Fatal**: 系统无法继续运行的错误
|
||||
- **Panic**: 程序崩溃的错误
|
||||
|
||||
### 2. 日志内容规范
|
||||
|
||||
- 记录关键业务操作
|
||||
- 包含足够的上下文信息
|
||||
- 使用结构化的字段
|
||||
- 避免记录敏感信息
|
||||
|
||||
### 3. 文件管理规范
|
||||
|
||||
- 定期清理旧日志文件
|
||||
- 监控日志文件大小
|
||||
- 设置合理的轮转策略
|
||||
- 备份重要日志
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 1. 常见问题
|
||||
|
||||
**问题**: 某个级别的日志文件没有创建
|
||||
**解决**: 检查该级别是否在配置中定义
|
||||
|
||||
**问题**: 日志文件权限问题
|
||||
**解决**: 确保应用有写入日志目录的权限
|
||||
|
||||
**问题**: 磁盘空间不足
|
||||
**解决**: 调整日志保留策略,减少保留天数
|
||||
|
||||
### 2. 性能问题
|
||||
|
||||
**问题**: 日志写入影响性能
|
||||
**解决**: 检查是否启用了异步写入
|
||||
|
||||
**问题**: 日志文件过大
|
||||
**解决**: 调整文件大小限制和轮转策略
|
||||
|
||||
## 相关文件
|
||||
|
||||
- `internal/shared/logger/level_logger.go` - 按级别分文件日志器实现
|
||||
- `internal/config/config.go` - 日志配置结构
|
||||
- `configs/env.production.yaml` - 生产环境日志配置
|
||||
- `internal/container/container.go` - 依赖注入配置
|
||||
Reference in New Issue
Block a user