audit

package
v0.0.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 2, 2026 License: MIT Imports: 7 Imported by: 0

README

audit 包 — 审计日志

所属层级: Infrastructure Layer
设计理念: 操作审计,异步处理
设计灵感: Spring Audit + Hibernate Envers

概述

audit 包提供操作审计日志记录功能,参考 Spring Boot 的 Spring Audit 设计。支持记录用户操作、数据变更、安全事件等,适用于需要审计追踪的企业级应用。

核心功能
功能 说明
多种事件类型 支持 CREATE/UPDATE/DELETE/LOGIN/SECURITY 等内置事件类型
异步处理 支持异步事件写入,提高性能,缓冲区满时自动降级为同步
多写入器 支持控制台、文件等多种 EventWriter 实现
拦截器 提供 AuditInterceptor 用于自动审计,可与 AOP 框架配合使用
日志助手 提供 AuditLogger 简化常见审计场景的日志记录

核心接口

Event 审计事件
type Event struct {
    ID           string
    Timestamp    time.Time
    Actor        string
    Action       EventType
    Resource     string
    Target       string
    Details      map[string]any
    Severity     EventSeverity
    Source       string
    Result       string
    ErrorMessage string
    Duration     time.Duration
    Tags         []string
}
事件类型 (EventType)
常量 说明
EventCreate "CREATE" 创建事件
EventUpdate "UPDATE" 更新事件
EventDelete "DELETE" 删除事件
EventRead "READ" 读取事件
EventLogin "LOGIN" 登录事件
EventLogout "LOGOUT" 登出事件
EventAccess "ACCESS" 访问事件
EventPermission "PERMISSION" 权限事件
EventSecurity "SECURITY" 安全事件
EventCustom "CUSTOM" 自定义事件
严重程度 (EventSeverity)
常量 说明
SeverityInfo "INFO" 普通信息
SeverityWarning "WARNING" 警告
SeverityError "ERROR" 错误
SeverityCritical "CRITICAL" 严重错误
EventWriter 事件写入器
type EventWriter interface {
    Write(event Event) error
    Close() error
}
ConsoleWriter 控制台写入器

将审计事件以 JSON 格式输出到标准输出:

writer := audit.NewConsoleWriter()
writer.Write(event)
FileWriter 文件写入器

将审计事件追加到指定文件:

writer, err := audit.NewFileWriter("/var/log/audit.log")
if err != nil {
    // 处理错误
}
defer writer.Close()

writer.Write(event)
Auditor 审计日志器
type Auditor struct {
    // ...
}
创建
auditor := audit.NewAuditor(
    audit.WithWriter(fileWriter),
    audit.WithAsync(),
    audit.WithBufferSize(1000),
)
defer auditor.Close()
选项函数
函数 说明 默认值
WithWriter(writer) 设置事件写入器 ConsoleWriter
WithBufferSize(size) 设置缓冲区大小(异步模式) 1000
WithAsync() 启用异步写入模式 关闭
记录事件
auditor.Log(audit.Event{
    Actor:    "user123",
    Action:   audit.EventCreate,
    Resource: "user",
    Target:   "user:456",
    Details:  map[string]any{"name": "John"},
})
便捷方法
方法 说明
LogAction(actor, action, resource, target, details) 记录操作事件
LogSecurity(actor, action, source, details) 记录安全事件
LogError(actor, action, resource, err) 记录错误事件
LogWithDuration(event, duration) 记录带耗时的审计事件
// 记录操作事件
auditor.LogAction("user123", audit.EventCreate, "user", "user:456", map[string]any{
    "name": "John",
})

// 记录安全事件
auditor.LogSecurity("user123", audit.EventLogin, "192.168.1.1", map[string]any{
    "reason": "invalid password",
})

// 记录错误事件
auditor.LogError("user123", audit.EventCreate, "user", err)
AuditInterceptor 审计拦截器

用于拦截方法调用并自动记录审计日志,通常与 AOP 框架配合使用。

创建
interceptor := audit.NewAuditInterceptor(auditor)
interceptor.SetActorFunc(func() string {
    return getCurrentUser()
})
interceptor.SetSourceFunc(func() string {
    return getRequestIP()
})
使用
// 方法执行前
interceptor.Before("CreateUser", []any{"John", "john@example.com"})

// 方法执行后
interceptor.After("CreateUser", nil, 100*time.Millisecond)
AuditLogger 审计日志助手

提供便捷的审计日志记录方法,封装常用的审计场景。

创建
logger := audit.NewAuditLogger(auditor, "user123", "web-app")
方法
方法 说明
Create(resource, target, details) 记录创建事件
Update(resource, target, details) 记录更新事件
Delete(resource, target) 记录删除事件
Login(source, details) 记录登录事件
LoginFailure(source, reason) 记录登录失败事件
PermissionDenied(resource, target) 记录权限拒绝事件
// 记录用户创建
logger.Create("user", "user:456", map[string]any{
    "name":  "John",
    "email": "john@example.com",
})

// 记录登录失败
logger.LoginFailure("192.168.1.1", "invalid password")

// 记录权限拒绝
logger.PermissionDenied("user", "user:789")

快速开始

基本使用
package main

import (
    "github.com/xudefa/enhance/audit"
)

func main() {
    auditor := audit.NewAuditor()
    defer auditor.Close()

    auditor.Log(audit.Event{
        Actor:    "user123",
        Action:   audit.EventCreate,
        Resource: "user",
        Target:   "user:456",
        Details:  map[string]any{"name": "John"},
    })
}
异步模式
auditor := audit.NewAuditor(
    audit.WithAsync(),
    audit.WithBufferSize(1000),
)
defer auditor.Close()

// 异步记录事件
for i := 0; i < 100; i++ {
    auditor.Log(audit.Event{
        Actor:  "user123",
        Action: audit.EventCreate,
    })
}

API 参考

使用审计日志助手
auditor := audit.NewAuditor()
defer auditor.Close()

logger := audit.NewAuditLogger(auditor, "admin", "admin-panel")

// 记录用户创建
logger.Create("user", "user:456", map[string]any{
    "name":  "John",
    "email": "john@example.com",
})

// 记录登录失败
logger.LoginFailure("192.168.1.1", "invalid password")

// 记录权限拒绝
logger.PermissionDenied("user", "user:789")
与 AOP 集成
type UserService struct {
    auditor *audit.Auditor
}

func (s *UserService) CreateUser(name string) error {
    interceptor := audit.NewAuditInterceptor(s.auditor)
    
    interceptor.Before("CreateUser", []any{name})
    defer func() {
        interceptor.After("CreateUser", nil, 0)
    }()
    
    // 创建用户逻辑...
    return nil
}

使用示例

场景 1: 用户操作审计

记录用户的关键操作,用于安全审计和追溯:

logger := audit.NewAuditLogger(auditor, currentUser, "web-app")

// 记录资源创建
logger.Create("user", userID, map[string]any{
    "name":  userName,
    "email": userEmail,
})

// 记录资源更新
logger.Update("user", userID, map[string]any{
    "role": "admin",
})

// 记录资源删除
logger.Delete("user", userID)
场景 2: 安全事件监控

监控和记录安全相关事件,如登录失败、权限拒绝等:

// 登录失败
auditor.LogSecurity(username, audit.EventLogin, clientIP, map[string]any{
    "reason": "invalid password",
    "attempt": attemptCount,
})

// 权限拒绝
logger.PermissionDenied(resource, target)

// 安全告警
auditor.Log(audit.Event{
    Actor:    "system",
    Action:   audit.EventSecurity,
    Severity: audit.SeverityCritical,
    Details:  map[string]any{"alert": "brute force detected"},
})
场景 3: API 访问审计

记录 API 访问日志,用于性能分析和故障排查:

func auditMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        
        interceptor := audit.NewAuditInterceptor(auditor)
        interceptor.SetActorFunc(func() string {
            return getUserFromRequest(r)
        })
        interceptor.SetSourceFunc(func() string {
            return r.RemoteAddr
        })
        
        interceptor.Before(r.URL.Path, nil)
        
        next.ServeHTTP(w, r)
        
        interceptor.After(r.URL.Path, nil, time.Since(start))
    })
}
场景 4: 数据变更追踪

记录数据的变更历史,用于审计和回滚:

func (s *OrderService) UpdateOrder(orderID string, updates map[string]any) error {
    oldOrder := s.getOrder(orderID)
    
    if err := s.applyUpdates(orderID, updates); err != nil {
        auditor.LogError(currentUser, audit.EventUpdate, "order", err)
        return err
    }
    
    auditor.Log(audit.Event{
        Actor:    currentUser,
        Action:   audit.EventUpdate,
        Resource: "order",
        Target:   orderID,
        Details: map[string]any{
            "old": oldOrder,
            "new": updates,
        },
    })
    
    return nil
}

最佳实践

1. 使用异步模式提升性能
// ✅ 推荐:高并发场景使用异步
auditor := audit.NewAuditor(
    audit.WithAsync(),
    audit.WithBufferSize(1000),
)
defer auditor.Close()

// ⚠️ 不推荐:同步模式影响性能
auditor := audit.NewAuditor()
2. 记录足够的上下文信息
// ✅ 推荐:包含详细信息
auditor.Log(audit.Event{
    Actor:    "user123",
    Action:   audit.EventCreate,
    Resource: "user",
    Target:   "user:456",
    Details: map[string]any{
        "name":  "John",
        "email": "john@example.com",
        "role":  "admin",
    },
    Source: "192.168.1.1",
})

// ⚠️ 不推荐:信息不足
auditor.Log(audit.Event{
    Actor:  "user123",
    Action: audit.EventCreate,
})
3. 使用合适的 Severity 级别
// ✅ 推荐:根据事件重要性设置 Severity
auditor.Log(audit.Event{
    Action:   audit.EventSecurity,
    Severity: audit.SeverityCritical,
    Details:  map[string]any{"alert": "brute force detected"},
})

// ⚠️ 不推荐:所有事件使用相同级别
auditor.Log(audit.Event{
    Action:   audit.EventCreate,
    Severity: audit.SeverityCritical, // 过度使用严重级别
})
4. 与 AOP 集成自动审计
// ✅ 推荐:使用拦截器自动审计
interceptor := audit.NewAuditInterceptor(auditor)
interceptor.SetActorFunc(func() string {
    return getCurrentUser()
})

// ⚠️ 不推荐:手动记录每个操作
auditor.Log(audit.Event{...})
5. 与依赖注入集成
// ✅ 推荐:将 Auditor 注册为 Bean
container.Register(
    reflect.TypeOf(&audit.Auditor{}),
    core.Bean(audit.NewAuditor(
        audit.WithAsync(),
        audit.WithBufferSize(1000),
    )),
    core.Singleton(),
)

// 注入使用
type UserService struct {
    Auditor *audit.Auditor `inject:"auditor"`
}

Documentation

Overview

Package audit 提供审计日志功能,用于 enhance 框架。

Package audit 提供审计日志功能,用于 enhance 框架。

该模块提供操作审计日志记录功能,支持记录用户操作、数据变更、安全事件等。 参考 Spring Boot 的 Spring Audit 设计。

架构设计

  • Auditor: 审计日志器接口,负责记录审计事件
  • Event: 审计事件,包含事件类型、操作人、资源等信息
  • EventWriter: 事件写入器接口,支持控制台、文件等多种写入方式
  • AuditInterceptor: 审计拦截器接口,用于自动审计
  • AuditLogger: 审计日志助手接口,简化审计日志记录
  • EventType/EventSeverity: 事件类型和严重程度枚举

核心功能

  • 事件类型: 支持 CREATE/UPDATE/DELETE/LOGIN/SECURITY 等多种事件类型
  • 异步处理: 支持异步事件写入,提高性能
  • 多写入器: 支持控制台、文件等多种写入方式
  • 拦截器: 提供 AuditInterceptor 用于自动审计
  • 日志助手: 提供 AuditLogger 简化审计日志记录

使用方式

创建审计日志器:

auditor := audit.NewAuditor(audit.WithWriter(consoleWriter))

记录操作日志:

auditor.Log(audit.Event{
    Actor:    "user123",
    Action:   audit.EventCreate,
    Resource: "user",
    Target:   "user:456",
    Details:  map[string]any{"name": "John"},
})

使用审计日志助手:

logger := audit.NewAuditLogger(auditor, "user123", "web-app")
logger.Create("user", "user:456", map[string]any{"name": "John"})

异步模式

auditor := audit.NewAuditor(
    audit.WithWriter(fileWriter),
    audit.WithAsync(),
    audit.WithBufferSize(1000),
)
defer auditor.Close()

设计原则

核心框架零外部依赖,仅使用 Go 标准库。

Package audit 提供审计日志功能,用于 enhance 框架。

Package audit 提供审计日志功能,用于 enhance 框架。

Package audit 提供审计日志功能,用于 enhance 框架。

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrWriterClosed 表示写入器已关闭。
	ErrWriterClosed = errors.New("audit writer is closed")
	// ErrChannelFull 表示事件通道已满。
	ErrChannelFull = errors.New("audit event channel is full")
)

审计模块错误变量。

Functions

This section is empty.

Types

type AuditInterceptor

type AuditInterceptor interface {
	// Intercept 拦截方法调用并记录审计日志。
	Intercept(methodName string, args []any, result any, err error)
}

AuditInterceptor 审计拦截器接口。

用于拦截方法调用并自动记录审计日志。 通常与 AOP 框架配合使用,实现声明式审计。

func NewAuditInterceptor

func NewAuditInterceptor(auditor Auditor) AuditInterceptor

NewAuditInterceptor 创建审计拦截器

默认操作者为 "system",来源为 "unknown"。

type AuditLogger

type AuditLogger interface {
	// Create 记录创建事件。
	Create(resource string, target string, details map[string]any)

	// Update 记录更新事件。
	Update(resource string, target string, details map[string]any)

	// Delete 记录删除事件。
	Delete(resource string, target string)

	// Login 记录登录事件。
	Login(target string, details map[string]any)

	// Security 记录安全事件。
	Severity(resource string, target string, severity EventSeverity, details map[string]any)
}

AuditLogger 审计日志助手接口。

提供便捷的审计日志记录方法,封装常用的审计场景。 通过预设操作者和来源信息,简化日志记录调用。

func NewAuditLogger

func NewAuditLogger(auditor Auditor, actor string, source string) AuditLogger

NewAuditLogger 创建审计日志助手。

type Auditor

type Auditor interface {
	// Log 记录审计事件。
	Log(event Event)

	// Close 关闭审计日志器,释放资源。
	Close() error

	// IsClosed 检查审计日志器是否已关闭。
	IsClosed() bool
}

Auditor 审计日志器接口。

负责记录审计事件,支持同步和异步两种写入模式。 异步模式下,事件会先写入缓冲区,由后台 goroutine 处理。

func NewAuditor

func NewAuditor(opts ...AuditorOption) Auditor

NewAuditor 创建审计日志器

支持通过选项函数配置写入器、缓冲区大小和异步模式。 默认使用控制台写入器,同步模式,缓冲区大小 1000。

示例:

auditor := audit.NewAuditor(
    audit.WithWriter(fileWriter),
    audit.WithAsync(),
    audit.WithBufferSize(500),
)

type AuditorOption

type AuditorOption func(auditor Auditor)

AuditorOption 审计器选项函数。

func WithAsync

func WithAsync() AuditorOption

WithAsync 启用异步写入模式。

func WithBufferSize

func WithBufferSize(size int) AuditorOption

WithBufferSize 设置缓冲区大小。

func WithWriter

func WithWriter(writer EventWriter) AuditorOption

WithWriter 设置事件写入器。

type Event

type Event struct {
	// ID 事件 ID。
	ID string `json:"id"`
	// Timestamp 事件时间戳。
	Timestamp time.Time `json:"timestamp"`
	// Actor 操作者(用户 ID 或系统)。
	Actor string `json:"actor"`
	// Action 操作类型。
	Action EventType `json:"action"`
	// Resource 资源类型。
	Resource string `json:"resource"`
	// Target 操作目标。
	Target string `json:"target,omitempty"`
	// Details 详细信息。
	Details map[string]any `json:"details,omitempty"`
	// Severity 严重程度。
	Severity EventSeverity `json:"severity"`
	// Source 事件来源(IP 地址、服务名等)。
	Source string `json:"source,omitempty"`
	// Result 操作结果(success/failure)。
	Result string `json:"result,omitempty"`
	// ErrorMessage 错误信息。
	ErrorMessage string `json:"errorMessage,omitempty"`
	// Duration 操作耗时。
	Duration time.Duration `json:"duration,omitempty"`
	// Tags 标签。
	Tags []string `json:"tags,omitempty"`
}

Event 审计事件。

type EventSeverity

type EventSeverity string

EventSeverity 事件严重程度。

const (
	// SeverityInfo 信息级别。
	SeverityInfo EventSeverity = "INFO"
	// SeverityWarning 警告级别。
	SeverityWarning EventSeverity = "WARNING"
	// SeverityError 错误级别。
	SeverityError EventSeverity = "ERROR"
	// SeverityCritical 严重级别。
	SeverityCritical EventSeverity = "CRITICAL"
)

内置严重程度。

type EventType

type EventType string

EventType 事件类型。

const (
	// EventCreate 创建事件。
	EventCreate EventType = "CREATE"
	// EventUpdate 更新事件。
	EventUpdate EventType = "UPDATE"
	// EventDelete 删除事件。
	EventDelete EventType = "DELETE"
	// EventRead 读取事件。
	EventRead EventType = "READ"
	// EventLogin 登录事件。
	EventLogin EventType = "LOGIN"
	// EventLogout 登出事件。
	EventLogout EventType = "LOGOUT"
	// EventAccess 访问事件。
	EventAccess EventType = "ACCESS"
	// EventPermission 权限事件。
	EventPermission EventType = "PERMISSION"
	// EventSecurity 安全事件。
	EventSecurity EventType = "SECURITY"
	// EventCustom 自定义事件。
	EventCustom EventType = "CUSTOM"
)

内置事件类型。

type EventWriter

type EventWriter interface {
	// Write 写入事件。
	Write(event Event) error

	// Close 关闭写入器,释放资源。
	Close() error
}

EventWriter 事件写入器接口。

用于将审计事件写入到不同的目标(控制台、文件等)。 实现应保证线程安全和写入的原子性。

func NewConsoleWriter

func NewConsoleWriter() EventWriter

NewConsoleWriter 创建控制台写入器。

func NewFileWriter

func NewFileWriter(filePath string) (EventWriter, error)

NewFileWriter 创建文件写入器

打开或创建指定路径的文件,使用 4KB 缓冲区进行缓冲写入。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL