oplog

package
v1.70.0 Latest Latest
Warning

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

Go to latest
Published: Aug 18, 2026 License: MIT Imports: 12 Imported by: 0

Documentation

Overview

Package oplog 提供异步操作日志队列: 请求/业务动作日志先入内存队列,由后台消费者批量写入 Sink, 不阻塞请求链路(go-admin 内存队列思路)。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Count added in v1.68.0

func Count(ctx context.Context, client *redis.Client, key string) (int64, error)

Count 返回存储的审计日志总数。

func QueryHandler added in v1.70.0

func QueryHandler(client *redis.Client, key string) iris.Handler

QueryHandler 返回审计日志查询 HTTP 处理器。 参数:offset(默认 0)、count(默认 20);响应 {code,message,data:{list,total}}。 配合 RedisListSink 使用;挂载位置与鉴权中间件由业务决定, 建议限制仅管理角色可访问(如叠加 web.Auth + rbac.RequireRole)。

Types

type Entry

type Entry struct {
	Time      time.Time     `json:"time"`
	UserID    int64         `json:"user_id"`
	UserEmail string        `json:"user_email"`
	Method    string        `json:"method"`
	Path      string        `json:"path"`
	Status    int           `json:"status"`
	Duration  time.Duration `json:"duration"`
	RequestID string        `json:"request_id"`
	Action    string        `json:"action"`
	Detail    string        `json:"detail"`
}

Entry 是单条操作日志。

func Query added in v1.68.0

func Query(ctx context.Context, client *redis.Client, key string, offset, count int64) ([]Entry, error)

Query 查询最近审计日志(时间倒序,offset/count 分页)。 损坏条目(历史格式不兼容)自动跳过,不影响整体查询。

type Queue

type Queue struct {
	// contains filtered or unexported fields
}

Queue 是异步操作日志队列。 Enqueue 非阻塞:队列满时丢弃新条目并计数,保证请求链路不被日志拖慢。

func NewQueue

func NewQueue(sink Sink, bufferSize int) *Queue

NewQueue 创建异步队列并启动后台消费者。 bufferSize 非正数时使用默认 1024。

func (*Queue) Close

func (q *Queue) Close(ctx context.Context) error

Close 停止接收新条目并等待消费者排空队列(幂等)。

func (*Queue) Dropped

func (q *Queue) Dropped() int64

Dropped 返回因队列满或关闭而被丢弃的条目数。

func (*Queue) Enqueue

func (q *Queue) Enqueue(entry Entry)

Enqueue 非阻塞入队;队列已满或已关闭时丢弃并计数。

func (*Queue) Failed

func (q *Queue) Failed() int64

Failed 返回写入 Sink 失败的批次条目数。

func (*Queue) Middleware

func (q *Queue) Middleware() iris.Handler

Middleware 返回 Iris 操作日志中间件,把请求信息入队。 注册顺序建议在 Auth 之后(可读取用户身份)。

type RedisListSink added in v1.68.0

type RedisListSink struct {
	// contains filtered or unexported fields
}

RedisListSink 把审计日志写入 Redis List(LPUSH 头部插入,倒序保留最近 limit 条)。 多实例共享存储,零配置审计落地;配合 Query 提供最近操作日志查询。 大数据量/复杂检索场景请改用 ES 或数据库 Sink。

func NewRedisListSink added in v1.68.0

func NewRedisListSink(client *redis.Client, key string, limit int64) *RedisListSink

NewRedisListSink 创建 Redis 审计存储。 key 为存储键(多应用隔离用不同 key);limit 为保留条数(<=0 表示不限制,注意内存占用)。

func (*RedisListSink) Write added in v1.68.0

func (s *RedisListSink) Write(ctx context.Context, entries []Entry) error

Write 批量写入条目(倒序 LPUSH 保持列表内时间倒序)。 写入失败返回错误;单条序列化失败整批返回错误(条目内部数据必须可 JSON 序列化)。

type Sink

type Sink interface {
	// Write 批量写入条目;返回错误时该批条目被丢弃并计入失败计数。
	Write(ctx context.Context, entries []Entry) error
}

Sink 是操作日志的落库目标;业务方实现(写数据库、ES、文件等)。

Jump to

Keyboard shortcuts

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