在生产环境中使用log.SetFlags(log.LstdFlags | log.Lshortfile)。

4
在Go中,是否将log.SetFlags(log.LstdFlags | log.Lshortfile)设置为生产环境的良好做法(至少是一般性的)?我想知道在生产环境中这样做是否会导致性能或安全问题。因为这不是log包在Go中的默认设置。至今仍未找到任何官方参考或意见文章涉及此事。

我从未在生产代码中看到过stdlib log包的实际使用(除非需要与某些期望*log.Logger的库进行交互,然后它只是一个简单的包装器),因此根据我的(非常不科学的)样本大小,常见做法甚至没有这种情况。 - Jonathan Hall
谢谢您的意见,那么您是如何监控或检测应用程序中可能出现的错误呢?目前,我的做法是通过将可能发生的错误记录到stdout/stderr(我正在使用Kubernetes),然后有一个名为“Fluentd”的“日志收集器”,它将汇总所有应用程序中的日志(包括错误消息)。 - Bayu
1
我使用一个日志记录器,只是不使用stdlib中的那个,因为它非常不灵活。我曾经参与过使用logrus、zerolog和其他少数不太流行的选项的项目。 - Jonathan Hall
我的个人观点是,无论你使用什么日志库,都必须允许在代码中透明地更改或添加后端,即使大多数日志最终都会进入stderr。 - Jonathan Hall
我的意思是在调试时记录日志行号 :). log.SetFlags(log.LstdFlags | log.Lshortfile) 将在我们的日志前面显示代码文件名和行号。在logrus中,我之前有过这样的经历:https://github.com/sirupsen/logrus/issues/63#issuecomment-476486166 - Bayu
显示剩余2条评论
1个回答

4

关于性能,是的,它会有一定影响,但基于各种原因,我认为这种影响微不足道。

测试

代码

package main

import (
    "io/ioutil"
    "log"
    "testing"
)

func BenchmarkStdLog(b *testing.B) {
    // We do not want to benchmark the shell
    stdlog := log.New(ioutil.Discard, "", log.LstdFlags)
    for i := 0; i < b.N; i++ {
        stdlog.Println("foo")
    }
}

func BenchmarkShortfile(b *testing.B) {
    slog := log.New(ioutil.Discard, "", log.LstdFlags|log.Lshortfile)
    for i := 0; i < b.N; i++ {
        slog.Println("foo")
    }
}

结果

goos: darwin
goarch: amd64
pkg: stackoverflow.com/go/logbench
BenchmarkStdLog-4        3803840           277 ns/op           4 B/op          1 allocs/op
BenchmarkShortfile-4     1000000          1008 ns/op         224 B/op          3 allocs/op

你的实际情况可能会有所不同,但数量级应该大致相等。

我认为影响可以忽略的原因

除非你写了很多日志,否则你的日志记录不太可能成为应用程序的瓶颈。在100次中的99次,日志不是瓶颈。

将应用程序启动并运行,进行负载测试和分析。然后您仍然可以进行优化。

提示:确保您可以扩展。


你好,感谢您详细和清晰的回答。根据您的经验,您认为这是一个好的做法/常规做法,可以在生产环境中实施吗?我只是一名远程工作者,没有太多程序员朋友,不知道人们是如何编程的 :) 。老实说,我只是担心世界上只有我一个人这样做LOL :D - Bayu
我个人只会将它用于调试目的:https://play.golang.org/p/Ehmkd8V_wm4 - Markus W Mahlberg
看起来在我的当前应用程序中是相同的,只是使用另一种方法,它使用“if os.GetEnv(“GO_ENV”)==“development””。只是在想,在生产中追踪日志有多难,当我们发现一个错误日志而不知道是哪个文件和哪一行时。看起来应该是这样的:)。再次感谢您的回复。 - Bayu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接