【问题标题】:How to change the format of log output in logrus?如何更改 logrus 中的日志输出格式?
【发布时间】:2018-02-25 08:45:31
【问题描述】:

我使用 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

【问题讨论】:

    标签: go logging


    【解决方案1】:

    标准 logrus-prefixed-formater 用法

    要实现这一点,您需要创建自己的 TextFormater 以满足 logrus Formatter 接口。然后,当您创建自己的格式化程序时,您将其传递给 logrus 结构初始化。其他方式围绕并接近您想要实现的是这个格式化程序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 的自定义输出

    链接到 gist 以使用更改格式的 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

    您可以像标准选项一样使用它,但请记住在您的文件中将导入更改为我的存储库

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

    【讨论】:

    • 感谢您在使用您提供的代码时更改了消息的格式,但不是我需要的,[info] 丢失,如何添加?
    • 它打印[2018-02-25 13:16:27] ERROR Starting Process,我需要它就像[ERROR]:2018-02-25 10:42:20 - Starting Process
    • 我所说的和你的很接近,但如果你需要确切的,你需要根据你的需要进行更改。最好的方法是处理整个formater.go 文件,然后您可以更改我添加到答案中的功能
    • 我尝试在newlogger 函数之后将该函数复制到我的程序中,但出现了很多错误,知道吗?像未解决的*TextFormatter 等,我同时导入“github.com/sirupsen/logrus”“fmt”“github.com/x-cray/logrus-prefixed-formatter”有什么想法吗?
    • 您可以省略 logrus-prefixed-formatter 导入,仅从该库复制整个 formater.go 文件并将其放在项目中的某个位置,然后在该文件中替换该函数,并将其用作新的格式化程序你的 logrus 初始化
    【解决方案2】:

    我想我已经很晚了,但最近我也在努力定制这种日志消息格式,我希望能以更简单的方式完成这项工作。来自 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:我对此很陌生,所以如果你们有更好的方法来做这件事,请分享。

    【讨论】:

      【解决方案3】:

      我采用了来自https://github.com/x-cray/logrus-prefixed-formatter/blob/master/formatter.go 的代码。 我创建了一个自己的格式化程序结构并实现了一个自己的 logrus 格式化程序接口的 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")
      }
      

      【讨论】:

      • 我想测试它,我在格式化程序中有错误:= format.LogFormat{} formatter.TimestampFormat = "2006-01-02 15:04:05"
      • 哦,是的,我的错,我将格式化程序放在一个自己的包中,这就是为什么我把它搞混了。现在应该修好了。
      • 我像这样使用新的记录器对象,请问您可以采用您的代码吗? ` logger := &logrus.Logger{ Out: os.Stderr, Level: level, Formatter: &logrus.TextFormatter{ DisableColors: true, TimestampFormat : "2006-01-02 15:04:05", FullTimestamp:true, }, } `
      • 好的,我可以让它工作 1+ ...但问题是所有的颜色和功能都不见了,你能接受吗?
      • github.com/x-cray/logrus-prefixed-formatter/blob/master/… 你应该看看这个并更改格式功能。
      【解决方案4】:

      正如之前的响应者所说,这里的答案是使用自定义格式化程序。 当我在寻找一种比默认 logrus 格式更易于阅读的快速解决方案时,我想出了这个格式化程序:

      代码和说明在那里:https://github.com/antonfisher/nested-logrus-formatter

      【讨论】:

        猜你喜欢
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        • 2019-08-04
        • 2022-01-21
        • 2012-07-19
        相关资源
        最近更新 更多