更改日志输出logrus的格式

时间:2018-02-25 08:45:31

标签: go

我使用go logrus,我需要更改输出消息的格式, 我尝试了几件没有成功的事情

我需要的是格式化为logrus

的格式

[error]: datetime - message

我没有成功的尝试就是这个

 logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: level,
        Formatter: &logrus.TextFormatter{
            DisableColors: true,
            TimestampFormat : "2006-01-02 15:04:05",
            FullTimestamp:true,

        },
    }

这产生以下

time="2018-02-25 10:42:20" level=error msg="Starting Process"

我希望它是

[INFO]:2018-02-25 10:42:20 - Starting Process

更新 如果zap更好定制 https://github.com/uber-go/zap 它也可以是一个解决方案

4 个答案:

答案 0 :(得分:11)

标准logrus-prefixed-formater用法

要实现此目的,您需要创建自己的TextFormater,以满足logrus Formatter接口。然后,当您创建自己的格式化程序时,将其传递给logrus struct初始化。另一种方式是你想要达到的目标,就是这个形成者https://github.com/x-cray/logrus-prefixed-formatter。基于这种形成器,您可以创建自己的。

在你的情况下你需要像那样使用

logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: logrus.DebugLevel,
        Formatter: &prefixed.TextFormatter{
            DisableColors: true,
            TimestampFormat : "2006-01-02 15:04:05",
            FullTimestamp:true,
            ForceFormatting: true,
        },
    }

logrus-prefixed-formater的定制输出

链接到要点以使用更改格式的logrus-prefixed-formatter副本 https://gist.github.com/t-tomalak/146e4269460fc63d6938264bb5aaa1db

如果你最终想要使用它,我会留下这个选项,因为在这个版本中你有你想要的确切格式,着色和标准格式器中可用的其他功能

自定义格式化程序

第三个选项是使用我创建的包https://github.com/t-tomalak/logrus-easy-formatter。它提供了根据需要格式化输出的简单选项,仅用于此目的。我删除了可能你不会使用的必要选项。

package main

import (
    "os"

    "github.com/sirupsen/logrus"
    "github.com/t-tomalak/logrus-easy-formatter"
)

func main() {
    logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: logrus.DebugLevel,
        Formatter: &easy.Formatter{
            TimestampFormat: "2006-01-02 15:04:05",
            LogFormat:       "[%lvl%]: %time% - %msg%",
        },
    }

    logger.Printf("Log message")
}

此示例代码将生成:

[INFO]: 2018-02-27 19:16:55 - Log message

此外,我想指出,如果将来想要更改格式化程序,则不应该使用任何问题,即默认Logrus TextFormatter/JSONFormatter

logrus-prefixed-formater的定制输出

如果您真的不想将此格式化程序复制到项目中,可以使用我的fork logrus-prefixed-formater复制/粘贴此代码 https://github.com/t-tomalak/logrus-prefixed-formatter

您可以像标准选项一样使用它,但请记住在go go file

中将导入更改为我的存储库
logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: logrus.DebugLevel,
        Formatter: &prefixed.TextFormatter{
            DisableColors: true,
            TimestampFormat : "2006-01-02 15:04:05",
            FullTimestamp:true,
            ForceFormatting: true,
        },
    }

答案 1 :(得分:1)

我从https://github.com/x-cray/logrus-prefixed-formatter/blob/master/formatter.go采用了此代码。 我创建了一个自己的formatter结构,并实现了logrus formatter接口的自己的Format函数。 我只需要一个没有颜色的文本输出,这可能是一个简单的解决方案。

// adopted from https://github.com/x-cray/logrus-prefixed-formatter/blob/master/formatter.go
package main

import (
    "bytes"
    "fmt"
    "log"
    "os"
    "strings"

    "github.com/sirupsen/logrus"
)

type LogFormat struct {
    TimestampFormat string
}

func (f *LogFormat) Format(entry *logrus.Entry) ([]byte, error) {
    var b *bytes.Buffer

    if entry.Buffer != nil {
        b = entry.Buffer
    } else {
        b = &bytes.Buffer{}
    }

    b.WriteByte('[')
    b.WriteString(strings.ToUpper(entry.Level.String()))
    b.WriteString("]:")
    b.WriteString(entry.Time.Format(f.TimestampFormat))

    if entry.Message != "" {
        b.WriteString(" - ")
        b.WriteString(entry.Message)
    }

    if len(entry.Data) > 0 {
        b.WriteString(" || ")
    }
    for key, value := range entry.Data {
        b.WriteString(key)
        b.WriteByte('=')
        b.WriteByte('{')
        fmt.Fprint(b, value)
        b.WriteString("}, ")
    }

    b.WriteByte('\n')
    return b.Bytes(), nil
}

func main() {
    formatter := LogFormat{}
    formatter.TimestampFormat = "2006-01-02 15:04:05"

    logrus.SetFormatter(&formatter)
    log.SetOutput(os.Stderr)

    logrus.WithFields(logrus.Fields{
        "animal": "walrus",
        "size":   10,
    }).Info("A group of walrus emerges from the ocean")
    logrus.Info("ugh ugh ugh ugh")
}

答案 2 :(得分:0)

正如先前的响应者所说,这里的答案是使用自定义格式化程序。 当我想寻找一种比默认logrus格式更具可读性的快速解决方案时,我想到了以下格式器:

nested logrus formatter

其中包含代码和说明:https://github.com/antonfisher/nested-logrus-formatter

答案 3 :(得分:0)

我想我现在还很晚,但是最近我也在努力定制这种日志消息格式,我希望最好以一种简单的方式来完成它。来自Python,这确实不像我想象的那么直接,并且logrus文档也不太清楚。

因此,我必须遍历他们的源代码才能真正完成此任务。这是我的相同代码。

type myFormatter struct {
    log.TextFormatter
}

func (f *myFormatter) Format(entry *log.Entry) ([]byte, error) {
// this whole mess of dealing with ansi color codes is required if you want the colored output otherwise you will lose colors in the log levels
    var levelColor int
    switch entry.Level {
    case log.DebugLevel, log.TraceLevel:
        levelColor = 31 // gray
    case log.WarnLevel:
        levelColor = 33 // yellow
    case log.ErrorLevel, log.FatalLevel, log.PanicLevel:
        levelColor = 31 // red
    default:
        levelColor = 36 // blue
    }
    return []byte(fmt.Sprintf("[%s] - \x1b[%dm%s\x1b[0m - %s\n", entry.Time.Format(f.TimestampFormat), levelColor, strings.ToUpper(entry.Level.String()), entry.Message)), nil
}

func main() {
    f, _ := os.OpenFile("log.txt", os.O_CREATE|os.O_WRONLY, 0777)
    logger := &log.Logger{
        Out:   io.MultiWriter(os.Stderr, f),
        Level: log.InfoLevel,
        Formatter: &myFormatter{log.TextFormatter{
            FullTimestamp:          true,
            TimestampFormat:        "2006-01-02 15:04:05",
            ForceColors:            true,
            DisableLevelTruncation: true,
        },
        },
    }
    logger.Info("Info message")
    logger.Warning("Warning message")

这是输出

± go run main.go                                                                                                                                                                                                                    <<<
[2019-05-13 18:10:34] - INFO - Info message
[2019-05-13 18:10:34] - WARNING - Warning message

PS:我对此很陌生,所以如果你们有更好的整齐方法,请分享。