完善日志和审计链路
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
package auditlog
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"hfb_sys/backend/internal/model"
|
||||
|
||||
"gorm.io/datatypes"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Meta struct {
|
||||
IP string
|
||||
UserAgent string
|
||||
RequestID string
|
||||
}
|
||||
|
||||
type Entry struct {
|
||||
ActorType string
|
||||
ActorID uint64
|
||||
Action string
|
||||
BizType string
|
||||
BizID *uint64
|
||||
Meta Meta
|
||||
Detail map[string]any
|
||||
}
|
||||
|
||||
// Append 在业务事务内写入审计日志,确保审计和业务状态一起提交或回滚。
|
||||
func Append(tx *gorm.DB, entry Entry) error {
|
||||
raw, err := marshalDetail(entry.Detail, entry.Meta.RequestID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
row := model.AuditLog{
|
||||
ActorType: entry.ActorType,
|
||||
ActorID: entry.ActorID,
|
||||
Action: entry.Action,
|
||||
BizType: entry.BizType,
|
||||
BizID: entry.BizID,
|
||||
IP: entry.Meta.IP,
|
||||
UserAgent: entry.Meta.UserAgent,
|
||||
Detail: datatypes.JSON(raw),
|
||||
}
|
||||
return tx.Create(&row).Error
|
||||
}
|
||||
|
||||
func marshalDetail(detail map[string]any, requestID string) ([]byte, error) {
|
||||
copied := make(map[string]any, len(detail)+1)
|
||||
for key, value := range detail {
|
||||
copied[key] = value
|
||||
}
|
||||
if requestID != "" {
|
||||
copied["request_id"] = requestID
|
||||
}
|
||||
return json.Marshal(copied)
|
||||
}
|
||||
Reference in New Issue
Block a user