feat: setup logs retention by max file size
This commit is contained in:
1 parent
70c8492f4f
commit
f914eae3c5
44 files changed
+2316
-161
No files matched your search
@@ -4,6 +4,7 @@ import (
|
||||
"RenewCMS/internal/domain/audit"
|
||||
"RenewCMS/internal/infrastructure/persistence/mappers"
|
||||
entity "RenewCMS/internal/infrastructure/persistence/models"
|
||||
"slices"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -186,3 +187,49 @@ func (a *AuditEventRepository) DeleteOlderThan(cutoff time.Time) (int, error) {
|
||||
result := a.db.Where("created_at < ?", cutoff.UTC()).Delete(&entity.AuditEvent{})
|
||||
return int(result.RowsAffected), result.Error
|
||||
}
|
||||
|
||||
const (
|
||||
deleteChunkSize = 500
|
||||
payloadSizeSQL = `COALESCE(SUM(
|
||||
OCTET_LENGTH(action) + OCTET_LENGTH(actor_name) + OCTET_LENGTH(target_type) +
|
||||
OCTET_LENGTH(target_id) + OCTET_LENGTH(target_name) + COALESCE(OCTET_LENGTH(failure_reason), 0) +
|
||||
COALESCE(OCTET_LENGTH(ip), 0) + COALESCE(OCTET_LENGTH(user_agent), 0) +
|
||||
OCTET_LENGTH(params) + OCTET_LENGTH(changes)), 0) AS payload, COUNT(*) AS total`
|
||||
)
|
||||
|
||||
type payloadRow struct {
|
||||
Payload int64
|
||||
Total int64
|
||||
}
|
||||
|
||||
func (a *AuditEventRepository) SizeBytes() (int64, error) {
|
||||
var row payloadRow
|
||||
if err := a.db.Model(&entity.AuditEvent{}).Select(payloadSizeSQL).Scan(&row).Error; err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return row.Payload + row.Total*audit.RowOverheadBytes, nil
|
||||
}
|
||||
|
||||
func (a *AuditEventRepository) DeleteOldest(limit int, before time.Time) (int, error) {
|
||||
if limit < 1 {
|
||||
return 0, nil
|
||||
}
|
||||
var ids []uint64
|
||||
err := a.db.Model(&entity.AuditEvent{}).
|
||||
Where("created_at < ?", before.UTC()).
|
||||
Order("created_at ASC, id ASC").
|
||||
Limit(limit).
|
||||
Pluck("id", &ids).Error
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
removed := 0
|
||||
for chunk := range slices.Chunk(ids, deleteChunkSize) {
|
||||
result := a.db.Where("id IN ?", chunk).Delete(&entity.AuditEvent{})
|
||||
if result.Error != nil {
|
||||
return removed, result.Error
|
||||
}
|
||||
removed += int(result.RowsAffected)
|
||||
}
|
||||
return removed, nil
|
||||
}
|
||||
Reference in new issue
Block a user