package logs
import (
"github.com/sirupsen/logrus"
"os"
"runtime"
"strings"
)
var(
MyLogger *myLogger
)
type myLogger struct {
*logrus.Logger
File *os.File
}
type myHook struct {
FileName string
Line string
Skip int
levels []logrus.Level
}
func (hook *myHook)Fire(entry *logrus.Entry) error {
fileName, line := findCaller(hook.Skip)
entry.Data[hook.FileName] = fileName
entry.Data[hook.Line] = line
return nil
}
func (hook *myHook)Levels() []logrus.Level {
return logrus.AllLevels
}
func NewMyHook(levels ...logrus.Level) logrus.Hook {
hook := myHook{
FileName:"filePath",
Line:"line",
Skip:5,
levels:levels,
}
if len(hook.levels) == 0{
hook.levels = logrus.AllLevels
}
return &hook
}
func getCaller(skip int) (string, int) {
_, file, line, ok := runtime.Caller(skip)
if !ok{
return "", 0
}
n := 0
for i:=len(file) -1; i >0; i--{
if string(file[i]) == "/" {
n++
if n >= 2 {
file = file[i+1:]
break
}
}
}
return file,line
}
func findCaller(skip int) (string,int) {
file := ""
line := 0
for i:=0; i<10; i++{
file, line = getCaller(skip+i)
if !strings.HasPrefix(file, "logrus"){
break
}
}
return file, line
}
func NewLogger(level logrus.Level, format logrus.Formatter, hook logrus.Hook) *logrus.Logger {
log := logrus.New()
log.Level = level
log.SetFormatter(format)
log.Hooks.Add(hook)
return log
}
func init() {
var(
file *os.File
err error
)
path := "logs/log.txt"
if file, err = os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm); err !=nil{
logrus.Error("打开日志文件错误:", err)
}
MyLogger = &myLogger{
File:file,
}
MyLogger.Logger = NewLogger(logrus.DebugLevel, &logrus.TextFormatter{FullTimestamp:true}, NewMyHook())
MyLogger.Logger.Out = MyLogger.File
}
func main() {
var (
wt sync.WaitGroup
)
for i:=0;i<1;i++{
wt.Add(1)
go func(i int) {
MyLogger.WithFields(logrus.Fields{
strconv.Itoa(i)+"test": i,
}).Info(strconv.Itoa(i)+"test")
wt.Done()
}(i)
}
wt.Wait()
}