72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
package systemsettings
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"git.apinb.com/ops/logs/internal/config"
|
|
"git.apinb.com/ops/logs/internal/impl"
|
|
"git.apinb.com/ops/logs/internal/models"
|
|
settingsv1 "git.apinb.com/ops/pkgs/systemsettings/v1"
|
|
)
|
|
|
|
var retentionDays atomic.Int64
|
|
|
|
func LoadInitial(ctx context.Context) (*settingsv1.Client, error) {
|
|
client, err := settingsv1.NewClient(
|
|
config.Spec.SystemSettings.BaseURL,
|
|
time.Duration(config.Spec.SystemSettings.TimeoutSeconds)*time.Second,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
values, err := client.Fetch(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
value, err := values.Require(settingsv1.OperationLogRetentionDays)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
retentionDays.Store(int64(value))
|
|
return client, nil
|
|
}
|
|
|
|
func Start(ctx context.Context, client *settingsv1.Client) {
|
|
refreshTicker := time.NewTicker(time.Duration(config.Spec.SystemSettings.RefreshSeconds) * time.Second)
|
|
cleanupTicker := time.NewTicker(time.Hour)
|
|
defer refreshTicker.Stop()
|
|
defer cleanupTicker.Stop()
|
|
cleanup(ctx)
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
return
|
|
case <-refreshTicker.C:
|
|
values, err := client.Fetch(ctx)
|
|
if err != nil {
|
|
log.Printf("logs: 刷新系统参数失败: %v", err)
|
|
continue
|
|
}
|
|
value, err := values.Require(settingsv1.OperationLogRetentionDays)
|
|
if err != nil {
|
|
log.Printf("logs: 应用系统参数失败: %v", err)
|
|
continue
|
|
}
|
|
retentionDays.Store(int64(value))
|
|
case <-cleanupTicker.C:
|
|
cleanup(ctx)
|
|
}
|
|
}
|
|
}
|
|
|
|
func cleanup(ctx context.Context) {
|
|
cutoff := time.Now().UTC().AddDate(0, 0, -int(retentionDays.Load()))
|
|
result := impl.DBService.WithContext(ctx).Where("created_at < ?", cutoff).Delete(&models.AuditLog{})
|
|
if result.Error != nil {
|
|
log.Printf("logs: 清理过期操作日志失败: %v", result.Error)
|
|
}
|
|
}
|