You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.1 KiB
143 lines
3.1 KiB
package logger
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
|
|
"github.com/rifflock/lfshook"
|
|
"github.com/sirupsen/logrus"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
AccessLogger = logrus.New()
|
|
RouterLogger = logrus.New()
|
|
ErrorLogger = logrus.New()
|
|
RdsLogger *RdsLoggerWriter
|
|
)
|
|
|
|
type CustomLogger struct {
|
|
File string
|
|
Logger *logrus.Logger
|
|
}
|
|
|
|
func New(LogFilePath string, RunMode string) {
|
|
|
|
var err error
|
|
_, err = os.Stat(LogFilePath)
|
|
switch {
|
|
case os.IsNotExist(err):
|
|
err = os.MkdirAll(LogFilePath, os.ModePerm)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
case os.IsPermission(err):
|
|
panic(err)
|
|
}
|
|
|
|
for _, item := range []CustomLogger{
|
|
{File: "access.log", Logger: AccessLogger},
|
|
{File: "router.log", Logger: RouterLogger},
|
|
{File: "error.log", Logger: ErrorLogger},
|
|
} {
|
|
loggerToFile(LogFilePath, item.File, item.Logger, RunMode)
|
|
}
|
|
|
|
RdsLogger = newRdsLoggerWriter(LogFilePath, "rds.log", logrus.New(), RunMode)
|
|
}
|
|
|
|
type LogFormatter struct{}
|
|
|
|
func (s *LogFormatter) Format(entry *logrus.Entry) ([]byte, error) {
|
|
|
|
var (
|
|
file string
|
|
dir string
|
|
l int
|
|
)
|
|
|
|
local, _ := time.LoadLocation("Asia/Shanghai")
|
|
timestamp := time.Now().In(local).Format("2006-01-02 15:04:05")
|
|
|
|
if entry.Caller != nil {
|
|
file = filepath.Base(entry.Caller.File)
|
|
dir = filepath.Dir(entry.Caller.File)
|
|
l = entry.Caller.Line
|
|
}
|
|
|
|
ssss, _ := os.Getwd()
|
|
//fmt.Println(entry.Data)
|
|
msg := fmt.Sprintf(
|
|
"[GOID:%d] [%s] %s [%s/%s:%d] %s\n",
|
|
getGID(),
|
|
strings.ToUpper(entry.Level.String()),
|
|
timestamp, strings.ReplaceAll(dir, ssss, ""), file, l,
|
|
entry.Message)
|
|
return []byte(msg), nil
|
|
}
|
|
|
|
func getGID() uint64 {
|
|
b := make([]byte, 64)
|
|
b = b[:runtime.Stack(b, false)]
|
|
b = bytes.TrimPrefix(b, []byte("goroutine "))
|
|
b = b[:bytes.IndexByte(b, ' ')]
|
|
n, _ := strconv.ParseUint(string(b), 10, 64)
|
|
return n
|
|
}
|
|
|
|
func loggerToFile(LogFilePath string, LogFileName string, LoggerInstance *logrus.Logger, RunMode string) {
|
|
fileName := path.Join(LogFilePath, LogFileName)
|
|
|
|
//writer := bufio.NewWriter(src)
|
|
//LoggerInstance.SetOutput(writer)
|
|
outSelect(LoggerInstance, RunMode)
|
|
LoggerInstance.SetReportCaller(true)
|
|
//LoggerInstance.SetFormatter(new(LogFormatter))
|
|
|
|
logWriter, _ := rotatelogs.New(
|
|
// 分割后的文件名称
|
|
fileName+".%Y%m%d.log",
|
|
|
|
// 生成软链,指向最新日志文件
|
|
rotatelogs.WithLinkName(fileName),
|
|
|
|
// 设置最大保存时间(2天)
|
|
rotatelogs.WithMaxAge(2*24*time.Hour),
|
|
|
|
// 设置日志切割时间间隔(1天)
|
|
rotatelogs.WithRotationTime(24*time.Hour),
|
|
)
|
|
|
|
writeMap := lfshook.WriterMap{
|
|
logrus.InfoLevel: logWriter,
|
|
logrus.FatalLevel: logWriter,
|
|
logrus.DebugLevel: logWriter,
|
|
logrus.WarnLevel: logWriter,
|
|
logrus.ErrorLevel: logWriter,
|
|
logrus.PanicLevel: logWriter,
|
|
}
|
|
|
|
lfHook := lfshook.NewHook(writeMap, &LogFormatter{})
|
|
|
|
// 新增 Hook
|
|
LoggerInstance.AddHook(lfHook)
|
|
}
|
|
|
|
func outSelect(LoggerInstance *logrus.Logger, RunMode string) {
|
|
if RunMode != "debug" {
|
|
src, err := os.OpenFile(os.DevNull, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
LoggerInstance.SetOutput(src)
|
|
} else {
|
|
LoggerInstance.SetOutput(os.Stdout)
|
|
}
|
|
}
|