54 lines
2.0 KiB
Go
54 lines
2.0 KiB
Go
package task
|
|
|
|
import (
|
|
"context"
|
|
stderrors "errors"
|
|
"fmt"
|
|
|
|
"github.com/hibiken/asynq"
|
|
"go.uber.org/zap"
|
|
|
|
"github.com/break/junhong_cmp_fiber/internal/application/auditarchive"
|
|
)
|
|
|
|
// AuditRetentionHandler 连续校验并按日物理清理已结束的在线日志。
|
|
type AuditRetentionHandler struct {
|
|
service *auditarchive.Service
|
|
logger *zap.Logger
|
|
cleanupEnabled bool
|
|
enabled bool
|
|
}
|
|
|
|
// NewAuditRetentionHandler 创建日留存处理器。
|
|
func NewAuditRetentionHandler(service *auditarchive.Service, logger *zap.Logger, cleanupEnabled, enabled bool) *AuditRetentionHandler {
|
|
return &AuditRetentionHandler{service: service, logger: logger, cleanupEnabled: cleanupEnabled, enabled: enabled}
|
|
}
|
|
|
|
// Handle 在关闭清理开关时只读校验,开启后从最早未完成日连续删除。
|
|
func (h *AuditRetentionHandler) Handle(ctx context.Context, _ *asynq.Task) error {
|
|
if !h.enabled {
|
|
h.logger.Info("日志日留存已停用,跳过任务")
|
|
return nil
|
|
}
|
|
if h.service == nil {
|
|
return fmt.Errorf("日志日留存服务未配置")
|
|
}
|
|
results, err := h.service.RetainPendingDays(ctx, h.cleanupEnabled)
|
|
for _, result := range results {
|
|
h.logger.Info("日志日留存处理完成",
|
|
zap.String("archive_date", result.ArchiveDate), zap.Bool("cleanup_enabled", h.cleanupEnabled),
|
|
zap.Int64("audit_event_count", result.EventCount), zap.Int64("event_resource_count", result.ResourceCount),
|
|
zap.Int64("integration_log_count", result.IntegrationCount), zap.Duration("duration", result.Duration))
|
|
}
|
|
if err != nil {
|
|
var blocked *auditarchive.RetentionBlockedError
|
|
if stderrors.As(err, &blocked) {
|
|
h.logger.Error("日志日留存日期推进已阻断", zap.String("archive_date", blocked.ArchiveDate), zap.String("source", blocked.Source), zap.String("failure_category", "archive_or_validation"), zap.Error(err))
|
|
} else {
|
|
h.logger.Error("日志日留存日期推进已阻断", zap.String("source", "retention"), zap.String("failure_category", "internal"), zap.Error(err))
|
|
}
|
|
return err
|
|
}
|
|
return nil
|
|
}
|