logrus 为什么不支持输出文件名和行号?

logrus 为什么不支持输出文件名和行号?

已邀请:

傅小黑

赞同来自: Xanthus

不推荐使用行号文件来定义这个的。不像解释性语言错误位置就是运行中的源码。

更推荐的是 log 的文案位置去找,比如 "action-a", "action-b"

pathbox - https://pathbox.github.io/

赞同来自:

貌似要打印文件名和行号有性能消耗,不是所有人都一定需要这样的需求。

可以通过 runtime.Caller(2), 自定义 *logrus.Entry 来实现

话说 logrus 在各个日志库的benchmark中,已经体现出了性能劣势

heramerom

赞同来自:

有个issue提到了这个问题,作者说太耗性能,所以没有加行号。不过下面有人用hook实现了。 https://github.com/sirupsen/logrus/issues/63

https://github.com/onrik/logrus

logrus 可以自定义tag的,如果几百万行的log,还是加tag比较好。

话说我也不太习惯他的log format, 所以自己定义了一个。

package logrus_hooks

import (
    "bytes"
    "fmt"
    "github.com/mattn/go-isatty"
    "github.com/sirupsen/logrus"
    "os"
    "runtime"
    "strings"
)

const (
    colorNoColor = "\033[0m"
    colorRed     = "\033[91m"
    colorGreen   = "\033[92m"
    colorYellow  = "\033[93m"
    colorMagenta = "\033[95m"
    colorCyan    = "\033[96m"
)

const (
    timeFormat = "2006-01-02 15:04:05"
)

var (
    isTerminal bool
)

func init() {
    isTerminal = isatty.IsTerminal(os.Stdout.Fd())
}

type textFormat struct {
    forceColors bool
}

func NewTextFormat(forceColor ...bool) *textFormat {
    return &textFormat{
        forceColors: len(forceColor) == 1 && forceColor[0],
    }
}

func (f *textFormat) Format(entry *logrus.Entry) ([]byte, error) {
    levelText := strings.ToUpper(entry.Level.String())[0:4]
    buf := bytes.NewBuffer(make([]byte, 0, 32))
    if (f.forceColors || isTerminal) && runtime.GOOS != "windows" {
        color := colorNoColor
        switch entry.Level {
        case logrus.DebugLevel:
            color = colorCyan
        case logrus.InfoLevel:
            color = colorGreen
        case logrus.WarnLevel:
            color = colorYellow
        case logrus.ErrorLevel:
            color = colorMagenta
        case logrus.PanicLevel, logrus.FatalLevel:
            color = colorRed
        }
        buf.WriteString(color)
    }
    buf.WriteString(fmt.Sprintf("[%s] ", entry.Time.Format(timeFormat)))
    buf.WriteString(fmt.Sprintf("[%s] ", levelText))
    for k, v := range entry.Data {
        buf.WriteString(fmt.Sprintf("[%s=%v] ", k, v))
    }
    buf.WriteString(entry.Message)
    if (f.forceColors || isTerminal) && runtime.GOOS != "windows" {
        buf.WriteString(colorNoColor)
    }
    buf.WriteString("\n")
    return buf.Bytes(), nil
}

keepeye - 帅到掉渣

赞同来自:

通过hook实现,给一个现成的: https://github.com/keepeye/logrus-filename

要回复问题请先登录注册