init
This commit is contained in:
89
serve/logger/hook.go
Normal file
89
serve/logger/hook.go
Normal file
@ -0,0 +1,89 @@
|
||||
package logger
|
||||
|
||||
import (
|
||||
"Edu/utils"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"time"
|
||||
|
||||
nested "github.com/antonfisher/nested-logrus-formatter"
|
||||
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
|
||||
"github.com/rifflock/lfshook"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// Hook
|
||||
type Hook struct {
|
||||
Path string
|
||||
File string
|
||||
}
|
||||
|
||||
// Levels 只定义 error, warn, panic 等级的日志,其他日志等级不会触发 hook
|
||||
func (this *Hook) Levels() []log.Level {
|
||||
return []log.Level{
|
||||
log.WarnLevel,
|
||||
log.ErrorLevel,
|
||||
log.PanicLevel,
|
||||
}
|
||||
}
|
||||
|
||||
// Fire 将异常日志写入到指定日志文件中
|
||||
func (this *Hook) Fire(entry *log.Entry) error {
|
||||
if isExist, _ := utils.PathExists(this.Path); !isExist {
|
||||
utils.MkdirAll(this.Path)
|
||||
}
|
||||
f, err := os.OpenFile(this.Path+this.File, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = f.Write(utils.AnyToByte(entry.Data))
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func formatter(isConsole bool) *nested.Formatter {
|
||||
fmtter := &nested.Formatter{
|
||||
HideKeys: true,
|
||||
TimestampFormat: "2006-01-02 15:04:05",
|
||||
CallerFirst: true,
|
||||
CustomCallerFormatter: func(frame *runtime.Frame) string {
|
||||
funcInfo := runtime.FuncForPC(frame.PC)
|
||||
if funcInfo == nil {
|
||||
return "error during runtime.FuncForPC"
|
||||
}
|
||||
fullPath, line := funcInfo.FileLine(frame.PC)
|
||||
return fmt.Sprintf(" [%v:%v]", filepath.Base(fullPath), line)
|
||||
},
|
||||
}
|
||||
if isConsole {
|
||||
fmtter.NoColors = false
|
||||
} else {
|
||||
fmtter.NoColors = true
|
||||
}
|
||||
return fmtter
|
||||
}
|
||||
|
||||
// NewHook
|
||||
func NewHook(logName string, rotationTime time.Duration, leastDay uint) log.Hook {
|
||||
writer, err := rotatelogs.New(
|
||||
// 日志文件
|
||||
logName+".%Y%m%d",
|
||||
rotatelogs.WithRotationCount(leastDay), // 只保留最近的N个日志文件
|
||||
)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
lfsHook := lfshook.NewHook(lfshook.WriterMap{
|
||||
log.DebugLevel: writer,
|
||||
log.InfoLevel: writer,
|
||||
log.WarnLevel: writer,
|
||||
log.ErrorLevel: writer,
|
||||
log.FatalLevel: writer,
|
||||
log.PanicLevel: writer,
|
||||
}, formatter(false))
|
||||
|
||||
return lfsHook
|
||||
}
|
63
serve/logger/init.go
Normal file
63
serve/logger/init.go
Normal file
@ -0,0 +1,63 @@
|
||||
package logger
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type Logger struct {
|
||||
*Option
|
||||
Logger *log.Logger
|
||||
}
|
||||
|
||||
type Option struct {
|
||||
File string `json:"file"`
|
||||
LeastDay uint `json:"least_day"`
|
||||
Level string `json:"level"`
|
||||
IsStdout bool `json:"is_stdout"`
|
||||
}
|
||||
|
||||
var logger *log.Logger
|
||||
|
||||
var loggerLevel = map[string]log.Level{
|
||||
"debug": log.DebugLevel,
|
||||
"info": log.InfoLevel,
|
||||
"warn": log.WarnLevel,
|
||||
"error": log.ErrorLevel,
|
||||
}
|
||||
|
||||
func (this *Logger) level() log.Level {
|
||||
if _, has := loggerLevel[this.Level]; !has {
|
||||
return log.ErrorLevel
|
||||
}
|
||||
return loggerLevel[this.Level]
|
||||
}
|
||||
|
||||
func (this *Logger) Load() {
|
||||
logger = this.Logger
|
||||
}
|
||||
|
||||
func (this *Logger) Init(option *Option) *Logger {
|
||||
this.Option = option
|
||||
|
||||
logger = log.New()
|
||||
logger.SetFormatter(&log.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05"})
|
||||
logger.SetReportCaller(true)
|
||||
logger.AddHook(NewHook(this.File, 0, this.LeastDay))
|
||||
|
||||
if this.IsStdout {
|
||||
logger.SetOutput(io.MultiWriter(os.Stdout))
|
||||
}
|
||||
logger.SetFormatter(formatter(true))
|
||||
logger.SetLevel(this.level())
|
||||
|
||||
this.Logger = logger
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
func NewLogger() *Logger {
|
||||
return &Logger{}
|
||||
}
|
37
serve/logger/serve.go
Normal file
37
serve/logger/serve.go
Normal file
@ -0,0 +1,37 @@
|
||||
package logger
|
||||
|
||||
import "github.com/sirupsen/logrus"
|
||||
|
||||
func Warn(args ...interface{}) {
|
||||
logger.Log(logrus.WarnLevel, args...)
|
||||
}
|
||||
|
||||
func Error(args ...interface{}) {
|
||||
logger.Log(logrus.ErrorLevel, args...)
|
||||
}
|
||||
|
||||
func Fatal(args ...interface{}) {
|
||||
logger.Log(logrus.FatalLevel, args...)
|
||||
logger.Exit(1)
|
||||
}
|
||||
|
||||
func Panic(args ...interface{}) {
|
||||
logger.Log(logrus.PanicLevel, args...)
|
||||
}
|
||||
|
||||
func WarnF(format string, args ...interface{}) {
|
||||
logger.Logf(logrus.WarnLevel, format, args...)
|
||||
}
|
||||
|
||||
func ErrorF(format string, args ...interface{}) {
|
||||
logger.Logf(logrus.ErrorLevel, format, args...)
|
||||
}
|
||||
|
||||
func FatalF(format string, args ...interface{}) {
|
||||
logger.Logf(logrus.FatalLevel, format, args...)
|
||||
logger.Exit(1)
|
||||
}
|
||||
|
||||
func PanicF(format string, args ...interface{}) {
|
||||
logger.Logf(logrus.PanicLevel, format, args...)
|
||||
}
|
Reference in New Issue
Block a user