gtong 39b8d9e9ac 9.16 2 luni în urmă
..
DESIGN.md 39b8d9e9ac 9.16 2 luni în urmă
README.md 39b8d9e9ac 9.16 2 luni în urmă
audit.go 39b8d9e9ac 9.16 2 luni în urmă
logger.go 39b8d9e9ac 9.16 2 luni în urmă
logger_test.go 39b8d9e9ac 9.16 2 luni în urmă
middleware.go 39b8d9e9ac 9.16 2 luni în urmă
types.go 39b8d9e9ac 9.16 2 luni în urmă

README.md

Logger Package

基于Go理念设计的简单、高性能日志和审计系统。

特性

  • 简单性: 最小化API,专注于核心功能
  • 可组合性: 支持选项模式和中间件组合
  • 并发安全: 所有操作都是goroutine安全的
  • 接口导向: 基于接口设计,便于测试和扩展
  • 高性能: 基于Uber Zap的高性能结构化日志
  • 审计功能: 完整的用户操作和系统事件审计

安装

go get go.uber.org/zap
go get modernc.org/sqlite
go get github.com/gin-gonic/gin

快速开始

基本日志使用

package main

import (
    "your-project/service/common/logger"
)

func main() {
    // 创建日志器
    log, err := logger.NewLogger(
        logger.WithDevelopment(true),
        logger.WithOutputPaths("stdout", "app.log"),
    )
    if err != nil {
        panic(err)
    }
    defer log.Sync()

    // 使用日志
    log.Info("应用启动")
    log.Error("发生错误", zap.Error(err))
}

审计功能使用

// 创建审计日志器
audit, err := logger.NewAuditLogger(
    logger.WithDatabasePath("audit.db"),
    logger.WithRetention(90), // 保留90天
)
if err != nil {
    panic(err)
}
defer audit.Sync()

// 记录审计事件
entry := &logger.AuditEntry{
    UserID:   "user123",
    Username: "john_doe",
    Action:   "login",
    IP:       "192.168.1.1",
    Success:  true,
}

err = audit.Record(entry)

HTTP中间件使用

r := gin.New()

// 添加审计和日志中间件
r.Use(logger.AuditMiddleware(audit, log))
r.Use(logger.RequestLogger(log))
r.Use(logger.RecoveryMiddleware(log))

// 你的路由
r.GET("/users", func(c *gin.Context) {
    // 自动记录审计和请求日志
    c.JSON(200, users)
})

API 文档

Logger 接口

type Logger interface {
    Debug(msg string, fields ...zap.Field)
    Info(msg string, fields ...zap.Field)
    Warn(msg string, fields ...zap.Field)
    Error(msg string, fields ...zap.Field)
    Fatal(msg string, fields ...zap.Field)

    With(fields ...zap.Field) Logger
    Named(name string) Logger
    Sync() error
}

AuditLogger 接口

type AuditLogger interface {
    Record(entry *AuditEntry) error
    Query(filter *AuditFilter) ([]*AuditEntry, error)
    Cleanup(retention time.Duration) error
    Sync() error
}

配置选项

Logger 选项

  • WithLevel(level zapcore.Level): 设置日志级别
  • WithOutputPaths(paths ...string): 设置输出路径
  • WithDevelopment(dev bool): 设置开发模式
  • WithEncoding(encoding string): 设置编码格式

AuditLogger 选项

  • WithDatabasePath(path string): 设置数据库路径
  • WithRetention(days int): 设置保留天数
  • WithBufferSize(size int): 设置缓冲区大小
  • WithEnabled(enabled bool): 启用/禁用审计

高级用法

上下文日志

// 将日志器放入上下文
ctx := logger.WithContext(context.Background(), logger)

// 从上下文获取日志器
log := logger.FromContext(ctx)

审计助手

helper := logger.NewAuditHelper(audit, logger)

// 便捷的审计方法
helper.RecordLogin(userID, username, ip, userAgent, success)
helper.RecordUserAction(userID, username, action, resource, resourceID, ip, success)
helper.RecordSystemEvent(event, details)

查询审计日志

filter := &logger.AuditFilter{
    UserID:    "user123",
    Action:    "login",
    StartTime: &startTime,
    EndTime:   &endTime,
    Limit:     100,
}

entries, err := audit.Query(filter)

测试

运行测试:

go test -v ./service/common/logger

设计理念

简单性 (Simplicity)

  • 最小化API设计
  • 清晰的职责分离
  • 直观的接口

可组合性 (Composition)

  • 选项模式配置
  • 中间件组合
  • 接口组合

并发安全 (Concurrency)

  • goroutine安全
  • 上下文集成
  • 优雅关闭

错误处理 (Error Handling)

  • 显式错误返回
  • 错误包装
  • 错误检查

接口导向 (Interface-oriented)

  • 小接口设计
  • 依赖注入
  • 便于测试

性能优化

  • 使用对象池复用审计对象
  • 异步审计写入
  • 数据库索引优化
  • 定期清理过期数据

许可证

遵循项目许可证。