【问题标题】:How to store output of logrus to some variable?如何将 logrus 的输出存储到某个变量?
【发布时间】:2021-08-21 11:09:39
【问题描述】:

这是将输入的值转换为 JSON 格式的代码。它显示了正确的输出,但我想存储该输出并使用fmt.Printf返回它

package main

import (
    log "github.com/sirupsen/logrus"
)

func main() {
    log.SetFormatter(&log.JSONFormatter{})
    standardFields := log.Fields{
        "Number of threads": "1",
        "Odd number":        "3",
    }
    log.WithFields(standardFields).Info("Golang")
}

【问题讨论】:

  • 你为什么要这么做?
  • logrus(与其他 99.9% 的日志记录包一样)支持“记录器”的概念,它是一个配置的对象,它以特定的方式执行记录;记录器有一个“输出”,它是一个io.Writer,负责存储要存储的序列化字节——参见this。因此,请创建一个具有合适输出的记录器实例(例如,bytes.Buffer 就可以了)并收工。
  • 这看起来是一个非常清晰的 XY 问题。你的目标是什么?例如,如果目标是测试日志记录,请使用 test logger。如果它是为了按照您想要的方式格式化您的日志,请使用custom formatter。如果您的目标是将这些“值”插入数据库或其他东西,您应该编写自己的记录器后端。

标签: go logging error-logging logrus


【解决方案1】:

当您使用logrus.New() 创建新记录器时,您可以提供Out 字段以指向您希望的任何io.Writer。这是该字段的文档:

type Logger struct {
    // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a
    // file, or leave it default which is `os.Stderr`. You can also set this to
    // something more adventurous, such as logging to Kafka.
    Out io.Writer
    ...
    ...

因此,例如,您可以创建一个新的 bytes.Buffer 并将其设置为 Out 字段。这类似于“记录到变量”。

同样,您可以使用SetOutput 函数设置默认记录器的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多