|
@@ -0,0 +1,98 @@
|
|
|
+package golog
|
|
|
+
|
|
|
+/**
|
|
|
+日志文件自动切换,默认保留15天内日志
|
|
|
+**/
|
|
|
+
|
|
|
+import (
|
|
|
+ "io"
|
|
|
+ "log"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/robfig/cron"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ //时间格式
|
|
|
+ FMT = "2006_01_02_15_04_05"
|
|
|
+)
|
|
|
+
|
|
|
+var (
|
|
|
+ //当前日志文件句柄
|
|
|
+ LogFile *os.File
|
|
|
+ //日志目录
|
|
|
+ LogPath = "./jylog"
|
|
|
+ //默认保留15天内的日志,-1为永久保留
|
|
|
+ SaveDays = 15
|
|
|
+ Cron = "0 0 0 * * ?"
|
|
|
+)
|
|
|
+
|
|
|
+/*
|
|
|
+使用方法:
|
|
|
+需要调用 InitGoLog进行初始化,不传任何参数,默认保留15天、默认原生log输出
|
|
|
+InitGoLog()
|
|
|
+InitGoLog(10)
|
|
|
+InitGoLog(xweb.RootApp().Logger.SetOutput)
|
|
|
+InitGoLog(7,xweb.RootApp().Logger.SetOutput)
|
|
|
+*/
|
|
|
+
|
|
|
+func InitGoLog(args ...interface{}) {
|
|
|
+ fileFunc := []func(w io.Writer){log.SetOutput}
|
|
|
+ for _, v := range args {
|
|
|
+ if vd, ok := v.(int); ok {
|
|
|
+ SaveDays = vd
|
|
|
+ } else if vf, ok := v.(func(w io.Writer)); ok {
|
|
|
+ fileFunc = append(fileFunc, vf)
|
|
|
+ } else if vs, ok := v.(string); ok {
|
|
|
+ _, err := cron.ParseStandard(vs)
|
|
|
+ if err == nil {
|
|
|
+ Cron = vs
|
|
|
+ } else { // 输出位置
|
|
|
+ LogPath = vs
|
|
|
+ log.Println(vs, err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Println(fileFunc, SaveDays, Cron)
|
|
|
+ os.Mkdir(LogPath, os.ModePerm)
|
|
|
+ go logfile(fileFunc...)
|
|
|
+ task := cron.New()
|
|
|
+ task.Start()
|
|
|
+ task.AddFunc(Cron, func() {
|
|
|
+ go logfile(fileFunc...)
|
|
|
+ time.Sleep(50 * time.Second)
|
|
|
+ if SaveDays > 0 {
|
|
|
+ filepath.Walk(LogPath, func(path string, info os.FileInfo, err error) error {
|
|
|
+ if (time.Now().Unix()-info.ModTime().Unix())/86400 > int64(SaveDays) {
|
|
|
+ log.Println("delete log file:", path, os.Remove(path))
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+//创建并切换输出文件
|
|
|
+func logfile(fileFunc ...func(w io.Writer)) {
|
|
|
+ now := time.Now().Format(FMT)
|
|
|
+ file, _ := os.Create(LogPath + "/" + now + ".log")
|
|
|
+ // log.SetOutput(file) // xweb.RootApp().Logger.SetOutput(file)
|
|
|
+ for _, func1 := range fileFunc {
|
|
|
+ func1(file)
|
|
|
+ }
|
|
|
+ go func(file *os.File) {
|
|
|
+ time.Sleep(5 * time.Second)
|
|
|
+ if LogFile != nil {
|
|
|
+ LogFile.Close()
|
|
|
+ }
|
|
|
+ LogFile = file
|
|
|
+ }(file)
|
|
|
+}
|
|
|
+
|
|
|
+//fileReg = regexp.MustCompile("^(\\d{4}_[0-9_]{14})\\.log$")
|
|
|
+// str := fileReg.FindStringSubmatch(info.Name())
|
|
|
+// if len(str) == 2 {
|
|
|
+// t, er := time.ParseInLocation(FMT, str[1], time.Local)
|
|
|
+// if er == nil {}}
|