Files
EdgeAPI/internal/tasks/server_access_log_cleaner.go

136 lines
2.9 KiB
Go
Raw Normal View History

2021-01-19 12:05:35 +08:00
package tasks
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/TeaOSLab/EdgeAPI/internal/goman"
2021-01-19 12:05:35 +08:00
"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() {
2021-01-19 12:05:35 +08:00
task := NewServerAccessLogCleaner()
goman.New(func() {
task.Start()
})
2021-01-19 12:05:35 +08:00
})
}
// ServerAccessLogCleaner 服务访问日志自动清理
2021-01-19 12:05:35 +08:00
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 {
2022-04-08 14:15:45 +08:00
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)
2021-01-19 12:05:35 +08:00
if err != nil {
return err
}
}
return nil
}
func (this *ServerAccessLogCleaner) cleanDB(db *dbs.DB, endDay string) error {
ones, columnNames, err := db.FindOnes("SHOW TABLES")
if err != nil {
return err
}
if len(columnNames) != 1 {
return errors.New("invalid column names: " + strings.Join(columnNames, ", "))
}
columnName := columnNames[0]
2022-03-08 19:55:39 +08:00
var reg = regexp.MustCompile(`^(?i)(edgeHTTPAccessLogs|edgeNSAccessLogs)_(\d{8})(_\d{4})?$`)
2021-01-19 12:05:35 +08:00
for _, one := range ones {
2022-03-08 19:55:39 +08:00
var tableName = one.GetString(columnName)
2021-01-19 12:05:35 +08:00
if len(tableName) == 0 {
continue
}
2022-03-08 19:55:39 +08:00
if !reg.MatchString(tableName) {
2021-01-19 12:05:35 +08:00
continue
}
2022-03-08 19:55:39 +08:00
var matches = reg.FindStringSubmatch(tableName)
var day = matches[2]
2021-01-19 12:05:35 +08:00
if day < endDay {
_, err = db.Exec("DROP TABLE " + tableName)
if err != nil {
return err
}
}
}
return nil
}