mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-03 23:20:26 +08:00
136 lines
2.9 KiB
Go
136 lines
2.9 KiB
Go
package tasks
|
|
|
|
import (
|
|
"encoding/json"
|
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
|
"github.com/TeaOSLab/EdgeAPI/internal/goman"
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
|
|
"github.com/iwind/TeaGo/dbs"
|
|
"github.com/iwind/TeaGo/logs"
|
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
|
"regexp"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func init() {
|
|
dbs.OnReadyDone(func() {
|
|
task := NewServerAccessLogCleaner()
|
|
goman.New(func() {
|
|
task.Start()
|
|
})
|
|
})
|
|
}
|
|
|
|
// ServerAccessLogCleaner 服务访问日志自动清理
|
|
type ServerAccessLogCleaner struct {
|
|
}
|
|
|
|
func NewServerAccessLogCleaner() *ServerAccessLogCleaner {
|
|
return &ServerAccessLogCleaner{}
|
|
}
|
|
|
|
func (this *ServerAccessLogCleaner) Start() {
|
|
ticker := time.NewTicker(12 * time.Hour)
|
|
for range ticker.C {
|
|
err := this.Loop()
|
|
if err != nil {
|
|
logs.Println("[TASK][ServerAccessLogCleaner]Error: " + err.Error())
|
|
}
|
|
}
|
|
}
|
|
|
|
func (this *ServerAccessLogCleaner) Loop() error {
|
|
// 当前设置
|
|
configJSON, err := models.SharedSysSettingDAO.ReadSetting(nil, systemconfigs.SettingCodeDatabaseConfigSetting)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(configJSON) == 0 {
|
|
return nil
|
|
}
|
|
config := &systemconfigs.DatabaseConfig{}
|
|
err = json.Unmarshal(configJSON, config)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if config.ServerAccessLog.Clean.Days <= 0 {
|
|
return nil
|
|
}
|
|
days := config.ServerAccessLog.Clean.Days
|
|
endDay := timeutil.Format("Ymd", time.Now().AddDate(0, 0, -days+1))
|
|
|
|
// 当前连接的数据库
|
|
db, err := dbs.Default()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = this.cleanDB(db, endDay)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 日志数据库节点
|
|
nodes, err := models.SharedDBNodeDAO.FindAllEnabledAndOnDBNodes(nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, node := range nodes {
|
|
err := func(node *models.DBNode) error {
|
|
var dbConfig = node.DBConfig()
|
|
nodeDB, err := dbs.NewInstanceFromConfig(dbConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer func() {
|
|
_ = nodeDB.Close()
|
|
}()
|
|
|
|
err = this.cleanDB(nodeDB, endDay)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}(node)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (this *ServerAccessLogCleaner) cleanDB(db *dbs.DB, endDay string) error {
|
|
ones, columnNames, err := db.FindPreparedOnes("SHOW TABLES")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(columnNames) != 1 {
|
|
return errors.New("invalid column names: " + strings.Join(columnNames, ", "))
|
|
}
|
|
columnName := columnNames[0]
|
|
var reg = regexp.MustCompile(`^(?i)(edgeHTTPAccessLogs|edgeNSAccessLogs)_(\d{8})(_\d{4})?$`)
|
|
for _, one := range ones {
|
|
var tableName = one.GetString(columnName)
|
|
if len(tableName) == 0 {
|
|
continue
|
|
}
|
|
if !reg.MatchString(tableName) {
|
|
continue
|
|
}
|
|
var matches = reg.FindStringSubmatch(tableName)
|
|
var day = matches[2]
|
|
|
|
if day < endDay {
|
|
_, err = db.Exec("DROP TABLE " + tableName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|