344 lines
8.6 KiB
Markdown
344 lines
8.6 KiB
Markdown
|
|
# 📝 按级别分文件日志系统说明
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
本系统支持按日志级别分文件存储,不同级别的日志写入不同的文件,便于日志管理和分析。
|
|||
|
|
|
|||
|
|
## 功能特性
|
|||
|
|
|
|||
|
|
### ✅ 按级别分文件
|
|||
|
|
- **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` - 依赖注入配置
|