是否可以使用golang std库格式化日志(如下所述)?

时间:2018-09-18 09:09:11

标签: go logging

  1. 2018年2月1日下午3:04:05(UTC)|这是日志消息

  2. 2018-02-01T15:04:05Z |这是日志消息

我在go src中找到了以下格式: https://github.com/golang/go/blob/master/src/log/log.go#L37 但似乎我无法仅通过使用那些来做到这一点。

3 个答案:

答案 0 :(得分:1)

此处有两个选项:

使用log.SetOutput设置自定义编写器。

或者使用fmt包代替,仅打印到stdout或其他地方-stdlib日志包并不能做很多事情,创建自己的日志包非常容易,该日志包会以自定义时间格式输出到stdout(或日志文件)。例如,以下几行是这样的软件包:

package log

import (
    "fmt"
    "time"
)

var TimeFormat = "2006-02-01T15:04:05Z"

func Printf(format string, args ...interface{}) {
    format = fmt.Sprintf("%s %s", time.Now().Format(TimeFormat), format)
    fmt.Printf(format, args...)
}

如果有特殊需要,我建议您自己做,并使用fmt.Printf输出到stdout。您实际上并不需要第三方日志包。

https://play.golang.org/p/iPeuGjQqEf4

答案 1 :(得分:1)

您可以将log.SetOutput(...)与参数编写器结合使用,该参数编写器可以使用所需的格式(例如内置的RFC3999或您选择的一种格式)打印条目,例如:

const timeFormat = time.RFC3339

type logWriter struct{}

func (lw *logWriter) Write(bs []byte) (int, error) {
  return fmt.Print(time.Now().UTC().Format(timeFormat), " | ", string(bs))
}

func main() {
  log.SetFlags(0)               // Omit default prefixes.
  log.SetOutput(new(logWriter)) // Use our custom writer.

  log.Printf("Hello, %s!", "World")
  // 2018-09-18T14:50:40Z | Hello, World!
}

您可以使用其他格式来更改时间戳,例如:

const timeFormat = "Jan 2, 2006 at 3:04:05pm (UTC)"

// ...
  log.Printf("Hello, %s!", "World")
  // Sep 18, 2018 at 2:52:26pm (UTC) | Hello, World!

答案 2 :(得分:0)

https://play.golang.org/p/hPCn3MflkgQ 这是一个答案。您应该处理Writer接口并使用它创建新的日志