Files
SafeLine/management/tcontrollerd/pkg/log/log.go
2024-07-04 17:54:34 +08:00

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{}
}