log.go 2.8 KB
Newer Older
1
package core
2 3 4

import (
	"fmt"
5 6
	"gin-vue-admin/config"
	"gin-vue-admin/global"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
7
	"gin-vue-admin/utils"
8
	"github.com/gin-gonic/gin"
9 10 11 12 13 14 15 16 17
	rotatelogs "github.com/lestrrat/go-file-rotatelogs"
	oplogging "github.com/op/go-logging"
	"io"
	"os"
	"strings"
	"time"
)

const (
Mr.奇淼('s avatar
Mr.奇淼( 已提交
18
	logDir      = "log"
19
	logSoftLink = "latest_log"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
20
	module      = "gin-vue-admin"
21 22 23 24 25 26
)

var (
	defaultFormatter = `%{time:2006/01/02 - 15:04:05.000} %{longfile} %{color:bold}▶ [%{level:.6s}] %{message}%{color:reset}`
)

27 28
func init() {
	c := global.GVA_CONFIG.Log
G
Granty1 已提交
29
	if c.Prefix == "" {
30
		_ = fmt.Errorf("logger prefix not found")
G
Granty1 已提交
31
	}
32 33
	logger := oplogging.MustGetLogger(module)
	var backends []oplogging.Backend
G
Granty1 已提交
34
	registerStdout(c, &backends)
35 36 37
	if fileWriter := registerFile(c, &backends); fileWriter != nil {
		gin.DefaultWriter = io.MultiWriter(fileWriter, os.Stdout)
	}
38
	oplogging.SetBackend(backends...)
39
	global.GVA_LOG = logger
40 41
}

G
Granty1 已提交
42
func registerStdout(c config.Log, backends *[]oplogging.Backend) {
43 44
	if c.Stdout != "" {
		level, err := oplogging.LogLevel(c.Stdout)
45 46 47
		if err != nil {
			fmt.Println(err)
		}
G
Granty1 已提交
48
		*backends = append(*backends, createBackend(os.Stdout, c, level))
49 50 51
	}
}

52
func registerFile(c config.Log, backends *[]oplogging.Backend) io.Writer {
53
	if c.File != "" {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
54
		if ok, _ := utils.PathExists(logDir); !ok {
55 56 57 58 59
			// directory not exist
			fmt.Println("create log directory")
			_ = os.Mkdir(logDir, os.ModePerm)
		}
		fileWriter, err := rotatelogs.New(
60
			logDir+string(os.PathSeparator)+"%Y-%m-%d-%H-%M.log",
61
			// generate soft link, point to latest log file
62
			rotatelogs.WithLinkName(logSoftLink),
63 64 65 66 67 68 69 70
			// maximum time to save log files
			rotatelogs.WithMaxAge(7*24*time.Hour),
			// time period of log file switching
			rotatelogs.WithRotationTime(24*time.Hour),
		)
		if err != nil {
			fmt.Println(err)
		}
71 72 73
		level, err := oplogging.LogLevel(c.File)
		if err != nil {
			fmt.Println(err)
74
		}
G
Granty1 已提交
75
		*backends = append(*backends, createBackend(fileWriter, c, level))
76 77

		return fileWriter
78
	}
79
	return nil
80 81
}

82
func createBackend(w io.Writer, c config.Log, level oplogging.Level) oplogging.Backend {
83 84 85 86 87 88 89 90 91 92 93
	backend := oplogging.NewLogBackend(w, c.Prefix, 0)
	stdoutWriter := false
	if w == os.Stdout {
		stdoutWriter = true
	}
	format := getLogFormatter(c, stdoutWriter)
	backendLeveled := oplogging.AddModuleLevel(oplogging.NewBackendFormatter(backend, format))
	backendLeveled.SetLevel(level, module)
	return backendLeveled
}

94
func getLogFormatter(c config.Log, stdoutWriter bool) oplogging.Formatter {
95 96 97 98 99 100 101 102 103 104 105 106 107
	pattern := defaultFormatter
	if !stdoutWriter {
		// Color is only required for console output
		// Other writers don't need %{color} tag
		pattern = strings.Replace(pattern, "%{color:bold}", "", -1)
		pattern = strings.Replace(pattern, "%{color:reset}", "", -1)
	}
	if !c.LogFile {
		// Remove %{logfile} tag
		pattern = strings.Replace(pattern, "%{longfile}", "", -1)
	}
	return oplogging.MustStringFormatter(pattern)
}