2023-12-21 22:17:40 +08:00
|
|
|
|
package logger
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
|
|
|
|
"os"
|
|
|
|
|
"path"
|
|
|
|
|
"runtime"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"service/library/configcenter"
|
|
|
|
|
|
|
|
|
|
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
|
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
red = 31
|
|
|
|
|
yellow = 33
|
|
|
|
|
blue = 36
|
|
|
|
|
gray = 37
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var Global *logrus.Logger
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
Global = logrus.New()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type DefaultFormatter struct{}
|
|
|
|
|
|
|
|
|
|
func (m *DefaultFormatter) Format(entry *logrus.Entry) ([]byte, error) {
|
|
|
|
|
// 根据不同的level展示颜色
|
2023-12-23 22:41:43 +08:00
|
|
|
|
//var levelColor int
|
|
|
|
|
//switch entry.Level {
|
|
|
|
|
//case logrus.DebugLevel, logrus.TraceLevel:
|
|
|
|
|
// levelColor = gray
|
|
|
|
|
//case logrus.WarnLevel:
|
|
|
|
|
// levelColor = yellow
|
|
|
|
|
//case logrus.ErrorLevel, logrus.FatalLevel, logrus.PanicLevel:
|
|
|
|
|
// levelColor = red
|
|
|
|
|
//default:
|
|
|
|
|
// levelColor = blue
|
|
|
|
|
//}
|
2023-12-21 22:17:40 +08:00
|
|
|
|
|
|
|
|
|
var b *bytes.Buffer
|
|
|
|
|
if entry.Buffer != nil {
|
|
|
|
|
b = entry.Buffer
|
|
|
|
|
} else {
|
|
|
|
|
b = &bytes.Buffer{}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
timestamp := entry.Time.Format("2006-01-02 15:04:05")
|
|
|
|
|
var newLog string
|
|
|
|
|
|
2023-12-23 22:41:43 +08:00
|
|
|
|
newLog = fmt.Sprintf("[%s] [%s] %s \n", timestamp, entry.Level, entry.Message)
|
2023-12-21 22:17:40 +08:00
|
|
|
|
b.WriteString(newLog)
|
|
|
|
|
return b.Bytes(), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func InitLogger(config configcenter.LoggerConfig) {
|
|
|
|
|
Global = logrus.New()
|
|
|
|
|
Global.SetFormatter(&DefaultFormatter{})
|
|
|
|
|
|
|
|
|
|
lvl, _ := logrus.ParseLevel(config.StdoutLevel)
|
|
|
|
|
Global.SetLevel(lvl)
|
|
|
|
|
|
|
|
|
|
/* 日志轮转相关函数
|
|
|
|
|
WithLinkName 为最新的日志建立软连接
|
|
|
|
|
WithRotationTime 设置日志分割的时间,隔多久分割一次
|
|
|
|
|
WithMaxAge 和 WithRotationCount二者只能设置一个
|
|
|
|
|
WithMaxAge 设置文件清理前的最长保存时间
|
|
|
|
|
WithRotationCount` 设置文件清理前最多保存的个数
|
|
|
|
|
*/
|
|
|
|
|
fileWriter, _ := rotatelogs.New(
|
|
|
|
|
config.FileAbsPath+"_%Y%m%d.Global",
|
|
|
|
|
rotatelogs.WithLinkName(config.FileAbsPath),
|
|
|
|
|
rotatelogs.WithMaxAge(time.Duration(86400*7)*time.Second),
|
|
|
|
|
rotatelogs.WithRotationTime(time.Duration(86400)*time.Second),
|
2024-05-06 17:36:16 +08:00
|
|
|
|
//rotatelogs.WithRotationSize(1024*1024*500),
|
2023-12-21 22:17:40 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var writers io.Writer
|
|
|
|
|
if config.StdoutEnable && config.FileEnable {
|
|
|
|
|
writers = io.MultiWriter(os.Stdout, fileWriter)
|
|
|
|
|
} else if config.StdoutEnable {
|
|
|
|
|
writers = io.MultiWriter(os.Stdout)
|
|
|
|
|
} else if config.FileEnable {
|
|
|
|
|
writers = io.MultiWriter(fileWriter)
|
|
|
|
|
}
|
|
|
|
|
Global.SetOutput(writers)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Trace(format string, args ...interface{}) {
|
|
|
|
|
pc, file, line, ok := runtime.Caller(1)
|
|
|
|
|
if !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
callInfo := fmt.Sprintf("(%s %s:%d) ", path.Base(runtime.FuncForPC(pc).Name()), path.Base(file), line)
|
|
|
|
|
if Global == nil {
|
|
|
|
|
fmt.Printf(callInfo+format+"\n", args...)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
Global.Tracef(callInfo+format, args...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Debug(format string, args ...interface{}) {
|
|
|
|
|
pc, file, line, ok := runtime.Caller(1)
|
|
|
|
|
if !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
callInfo := fmt.Sprintf("(%s %s:%d) ", path.Base(runtime.FuncForPC(pc).Name()), path.Base(file), line)
|
|
|
|
|
if Global == nil {
|
|
|
|
|
fmt.Printf(callInfo+format+"\n", args...)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
Global.Debugf(callInfo+format, args...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Info(format string, args ...interface{}) {
|
|
|
|
|
pc, file, line, ok := runtime.Caller(1)
|
|
|
|
|
if !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
callInfo := fmt.Sprintf("(%s %s:%d) ", path.Base(runtime.FuncForPC(pc).Name()), path.Base(file), line)
|
|
|
|
|
if Global == nil {
|
|
|
|
|
fmt.Printf(callInfo+format+"\n", args...)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
Global.Infof(callInfo+format, args...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Warn(format string, args ...interface{}) {
|
|
|
|
|
pc, file, line, ok := runtime.Caller(1)
|
|
|
|
|
if !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
callInfo := fmt.Sprintf("(%s %s:%d) ", path.Base(runtime.FuncForPC(pc).Name()), path.Base(file), line)
|
|
|
|
|
if Global == nil {
|
|
|
|
|
fmt.Printf(callInfo+format+"\n", args...)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
Global.Warnf(callInfo+format, args...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Error(format string, args ...interface{}) {
|
|
|
|
|
pc, file, line, ok := runtime.Caller(1)
|
|
|
|
|
if !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
callInfo := fmt.Sprintf("(%s %s:%d) ", path.Base(runtime.FuncForPC(pc).Name()), path.Base(file), line)
|
|
|
|
|
if Global == nil {
|
|
|
|
|
fmt.Printf(callInfo+format+"\n", args...)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
Global.Errorf(callInfo+format, args...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Fatal(format string, args ...interface{}) {
|
|
|
|
|
pc, file, line, ok := runtime.Caller(1)
|
|
|
|
|
if !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
callInfo := fmt.Sprintf("(%s %s:%d) ", path.Base(runtime.FuncForPC(pc).Name()), path.Base(file), line)
|
|
|
|
|
if Global == nil {
|
|
|
|
|
fmt.Printf(callInfo+format+"\n", args...)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
Global.Fatalf(callInfo+format, args...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Panic(format string, args ...interface{}) {
|
|
|
|
|
pc, file, line, ok := runtime.Caller(1)
|
|
|
|
|
if !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
callInfo := fmt.Sprintf("(%s %s:%d) ", path.Base(runtime.FuncForPC(pc).Name()), path.Base(file), line)
|
|
|
|
|
if Global == nil {
|
|
|
|
|
fmt.Printf(callInfo+format+"\n", args...)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
Global.Panicf(callInfo+format, args...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Recover() {
|
|
|
|
|
err := recover()
|
|
|
|
|
if err != nil {
|
|
|
|
|
buf := make([]byte, 10240)
|
|
|
|
|
runtime.Stack(buf, false)
|
|
|
|
|
Error("panic: %v,\n%s", err, string(buf))
|
|
|
|
|
}
|
|
|
|
|
}
|