镜像自地址
https://github.com/tuna/tunasync.git
已同步 2025-12-06 06:26:46 +00:00
feature(worker): LogLimiter hook
这个提交包含在:
108
worker/loglimit_hook.go
普通文件
108
worker/loglimit_hook.go
普通文件
@@ -0,0 +1,108 @@
|
||||
package worker
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// limit
|
||||
|
||||
type logLimiter struct {
|
||||
emptyHook
|
||||
provider mirrorProvider
|
||||
}
|
||||
|
||||
func newLogLimiter(provider mirrorProvider) *logLimiter {
|
||||
return &logLimiter{
|
||||
provider: provider,
|
||||
}
|
||||
}
|
||||
|
||||
type fileSlice []os.FileInfo
|
||||
|
||||
func (f fileSlice) Len() int { return len(f) }
|
||||
func (f fileSlice) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
|
||||
func (f fileSlice) Less(i, j int) bool { return f[i].ModTime().Before(f[j].ModTime()) }
|
||||
|
||||
func (l *logLimiter) preExec() error {
|
||||
logger.Debug("executing log limitter for %s", l.provider.Name())
|
||||
|
||||
p := l.provider
|
||||
if p.LogFile() == "/dev/null" {
|
||||
return nil
|
||||
}
|
||||
|
||||
logDir := p.LogDir()
|
||||
files, err := ioutil.ReadDir(logDir)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
os.MkdirAll(logDir, 0755)
|
||||
} else {
|
||||
return err
|
||||
}
|
||||
}
|
||||
matchedFiles := []os.FileInfo{}
|
||||
for _, f := range files {
|
||||
if strings.HasPrefix(f.Name(), p.Name()) {
|
||||
matchedFiles = append(matchedFiles, f)
|
||||
}
|
||||
}
|
||||
|
||||
// sort the filelist in time order
|
||||
// earlier modified files are sorted as larger
|
||||
sort.Sort(
|
||||
sort.Reverse(
|
||||
fileSlice(matchedFiles),
|
||||
),
|
||||
)
|
||||
// remove old files
|
||||
if len(matchedFiles) > 9 {
|
||||
for _, f := range matchedFiles[9:] {
|
||||
// logger.Debug(f.Name())
|
||||
os.Remove(filepath.Join(logDir, f.Name()))
|
||||
}
|
||||
}
|
||||
|
||||
logFile := filepath.Join(
|
||||
logDir,
|
||||
fmt.Sprintf(
|
||||
"%s_%s.log",
|
||||
p.Name(),
|
||||
time.Now().Format("2006-01-02_15_04"),
|
||||
),
|
||||
)
|
||||
|
||||
logLink := filepath.Join(logDir, "latest")
|
||||
|
||||
if _, err = os.Stat(logLink); err == nil {
|
||||
os.Remove(logLink)
|
||||
}
|
||||
os.Symlink(logFile, logLink)
|
||||
|
||||
ctx := p.EnterContext()
|
||||
ctx.Set(_LogFileKey, logFile)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *logLimiter) postSuccess() error {
|
||||
l.provider.ExitContext()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *logLimiter) postFail() error {
|
||||
logFile := l.provider.LogFile()
|
||||
logFileFail := logFile + ".fail"
|
||||
logDir := l.provider.LogDir()
|
||||
logLink := filepath.Join(logDir, "latest")
|
||||
os.Rename(logFile, logFileFail)
|
||||
os.Remove(logLink)
|
||||
os.Symlink(logFileFail, logLink)
|
||||
|
||||
l.provider.ExitContext()
|
||||
return nil
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户