Files
tyapi-server/docs/按级别分文件日志系统说明.md
2025-07-28 15:21:37 +08:00

8.6 KiB
Raw Permalink Blame History

📝 按级别分文件日志系统说明

概述

本系统支持按日志级别分文件存储,不同级别的日志写入不同的文件,便于日志管理和分析。

功能特性

按级别分文件

  • 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

配置说明

基础配置

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. 基本使用

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. 带上下文的日志

// 从Gin上下文获取日志器
ctx := c.Request.Context()
log := logger.GetLogger().WithContext(ctx)

log.Info("处理用户请求",
    zap.String("action", "user_login"),
    zap.String("ip", c.ClientIP()),
)

3. 结构化日志字段

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. 查看特定级别日志

# 查看错误日志
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. 统计各级别日志数量

# 统计错误日志数量
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. 搜索特定内容

# 在错误日志中搜索特定错误
grep "数据库连接失败" logs/2024-01-01/error.log

# 在警告日志中搜索特定警告
grep "用户多次登录失败" logs/2024-01-01/warn.log

# 在信息日志中搜索特定操作
grep "用户登录成功" logs/2024-01-01/info.log

4. 使用jq分析JSON日志

# 分析错误日志
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. 错误日志监控

# 监控错误日志增长
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. 告警配置

# 检查错误日志是否超过阈值
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 - 依赖注入配置