初始提交
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
package logger
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Logger 全局日志实例
|
||||
var Logger *log.Logger
|
||||
var logFile *os.File
|
||||
var logFileName string
|
||||
var mu sync.Mutex
|
||||
|
||||
// InitLogger 初始化日志,创建 /data/logs 目录并按天命名文件
|
||||
func InitLogger() error {
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
|
||||
// 创建 /data/logs 目录
|
||||
logDir := "/data/logs"
|
||||
if err := os.MkdirAll(logDir, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 按天生成日志文件名:20260102.log
|
||||
logFileName = filepath.Join(logDir, time.Now().Format("20060102")+".log")
|
||||
file, err := os.OpenFile(logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
logFile = file
|
||||
Logger = log.New(file, "", log.LstdFlags)
|
||||
|
||||
// 每天凌晨检查是否需要切换日志文件
|
||||
go func() {
|
||||
for {
|
||||
// 每天检查一次(凌晨 00:05 执行)
|
||||
now := time.Now()
|
||||
next := time.Date(now.Year(), now.Month(), now.Day()+1, 0, 5, 0, 0, now.Location())
|
||||
time.Sleep(time.Until(next))
|
||||
|
||||
mu.Lock()
|
||||
newFileName := filepath.Join(logDir, time.Now().Format("20060102")+".log")
|
||||
if newFileName != logFileName {
|
||||
newFile, err := os.OpenFile(newFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
log.Printf("Failed to switch the log file: %v", err)
|
||||
mu.Unlock()
|
||||
continue
|
||||
}
|
||||
logFile.Close()
|
||||
logFile = newFile
|
||||
logFileName = newFileName
|
||||
Logger = log.New(newFile, "", log.LstdFlags)
|
||||
Logger.Println("The log file has been switched:", newFileName)
|
||||
}
|
||||
mu.Unlock()
|
||||
}
|
||||
}()
|
||||
return nil
|
||||
}
|
||||
|
||||
// CloseLogger 关闭日志文件
|
||||
func CloseLogger() {
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
if logFile != nil {
|
||||
logFile.Close()
|
||||
logFile = nil
|
||||
}
|
||||
}
|
||||
|
||||
// CleanupOldLogs 删除超过30天的日志文件
|
||||
func CleanupOldLogs() {
|
||||
logDir := "/data/logs"
|
||||
files, err := os.ReadDir(logDir)
|
||||
if err != nil {
|
||||
if Logger != nil {
|
||||
Logger.Printf("Read the log directory %s Error: %v", logDir, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
const maxAge = 30 * 24 * time.Hour // 30天
|
||||
for _, file := range files {
|
||||
if file.IsDir() {
|
||||
continue
|
||||
}
|
||||
info, err := file.Info()
|
||||
if err != nil {
|
||||
if Logger != nil {
|
||||
Logger.Printf("Obtain file information %s Error: %v", file.Name(), err)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if time.Since(info.ModTime()) > maxAge {
|
||||
filePath := filepath.Join(logDir, file.Name())
|
||||
if err := os.Remove(filePath); err != nil {
|
||||
if Logger != nil {
|
||||
Logger.Printf("Delete the old log files %s Error: %v", filePath, err)
|
||||
}
|
||||
} else {
|
||||
if Logger != nil {
|
||||
Logger.Printf("Delete the old log files %s succeed", filePath)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user