mirror of
https://github.com/chaitin/SafeLine.git
synced 2026-02-02 14:53:54 +08:00
118 lines
2.6 KiB
Go
118 lines
2.6 KiB
Go
package log
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"chaitin.cn/dev/go/log"
|
|
"chaitin.cn/patronus/safeline-2/management/tcontrollerd/pkg/config"
|
|
"chaitin.cn/patronus/safeline-2/management/tcontrollerd/utils"
|
|
)
|
|
|
|
func GetLogger(name string) *log.Logger {
|
|
return log.GetLogger(name)
|
|
}
|
|
|
|
func LoadLogLevel() {
|
|
lv, _ := log.ParseLevel(config.GlobalConfig.Log.Level)
|
|
log.SetLevel(log.AllLoggers, lv)
|
|
}
|
|
|
|
func SetLogFormatter() {
|
|
// format
|
|
formatter := new(log.TextFormatter)
|
|
formatter.FullTimestamp = true
|
|
formatter.TimestampFormat = "2006/01/02 15:04:05"
|
|
log.SetFormatter(log.AllLoggers, formatter)
|
|
}
|
|
|
|
func InitLogger() error {
|
|
// output
|
|
switch config.GlobalConfig.Log.Output {
|
|
case "stdout":
|
|
log.SetOutput(log.AllLoggers, os.Stdout)
|
|
case "stderr":
|
|
log.SetOutput(log.AllLoggers, os.Stderr)
|
|
default:
|
|
exist, err := utils.FileExist(config.GlobalConfig.Log.Output)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fileFlag := os.O_WRONLY | os.O_APPEND | os.O_SYNC
|
|
if !exist {
|
|
if err := utils.EnsureFileDir(config.GlobalConfig.Log.Output); err != nil {
|
|
return err
|
|
}
|
|
fileFlag = fileFlag | os.O_CREATE
|
|
}
|
|
|
|
if fp, err := os.OpenFile(config.GlobalConfig.Log.Output, fileFlag, os.ModePerm); err != nil {
|
|
return fmt.Errorf("failed to open log file: %s", err.Error())
|
|
} else {
|
|
log.SetOutput(log.AllLoggers, log.NewLockOutput(fp))
|
|
}
|
|
}
|
|
|
|
// hook
|
|
log.AddHook(log.AllLoggers, NewRuntimeHook())
|
|
log.AddHook(log.AllLoggers, log.NewErrorStackHook(true))
|
|
// level
|
|
LoadLogLevel()
|
|
|
|
return nil
|
|
}
|
|
|
|
type RuntimeHook struct{}
|
|
|
|
func (h *RuntimeHook) Levels() []logrus.Level {
|
|
return logrus.AllLevels
|
|
}
|
|
|
|
func (h *RuntimeHook) Fire(entry *logrus.Entry) error {
|
|
file := "???"
|
|
funcName := "???"
|
|
line := 0
|
|
|
|
pc := make([]uintptr, 64)
|
|
// Skip runtime.Callers, self, and another call from logrus
|
|
n := runtime.Callers(3, pc)
|
|
if n != 0 {
|
|
pc = pc[:n] // pass only valid pcs to runtime.CallersFrames
|
|
frames := runtime.CallersFrames(pc)
|
|
|
|
// Loop to get frames.
|
|
// A fixed number of pcs can expand to an indefinite number of Frames.
|
|
for {
|
|
frame, more := frames.Next()
|
|
if !strings.Contains(frame.File, "github.com/sirupsen/logrus") && !strings.Contains(frame.Function, "chaitin.cn/dev/go") {
|
|
file = frame.File
|
|
funcName = frame.Function
|
|
line = frame.Line
|
|
break
|
|
}
|
|
if !more {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
slices := strings.Split(file, "/")
|
|
file = slices[len(slices)-1]
|
|
|
|
funcName = strings.ReplaceAll(funcName, "chaitin.cn", "")
|
|
|
|
entry.Data["file"] = file
|
|
entry.Data["func"] = funcName
|
|
entry.Data["line"] = line
|
|
return nil
|
|
}
|
|
|
|
func NewRuntimeHook() *RuntimeHook {
|
|
return &RuntimeHook{}
|
|
}
|