【问题标题】:Stop appending logs into go.log file停止将日志附加到 go.log 文件中
【发布时间】:2016-09-24 15:03:27
【问题描述】:

我使用 Go 1.5.2 卡式盒在 Openshift 上部署了我的 Go 应用程序。作为一种好的做法,我养成了生成有关应用程序出现故障的任何日志的习惯。但事实证明,这种习惯在 Openshift 环境中代价高昂,因为提供给我的存储空间有限(1 GB)。日志在使用几秒钟内很容易超过 10 MB 标记,我担心如果我不管理日志文件,我的应用程序会用完空间。目前,我正在定期手动清除日志文件。

有什么方法可以停止将日志附加到文件中,或者完全停止日志的生成(而不影响我的原始应用程序代码)?我已经尝试撤销文件的写权限,但日志仍然出现。

【问题讨论】:

  • 你使用的是标准的 go log 包吗?
  • @BenCampbell 是的。
  • 如果您正确地从go.log 中删除了写入权限,除非它足够聪明地chmod 文件,否则它是不可能写入的。您可以尝试chmod 544 并检查是否仍然发生写入吗?
  • 在查看 Openshift 文档几分钟后,我发现您可以通过重定向输出来利用他们的日志轮换,如下所述:access.redhat.com/documentation/en-US/OpenShift_Enterprise/2/…

标签: logging go openshift


【解决方案1】:

理想情况下,您会希望使用有助于提高日志级别的记录器。这将允许您根据当前运行时上下文调整日志的详细程度。您可以查看How to implement level based logging in golang 问题以获取丰富的信息和包以促进日志级别。作为开发人员,您可以包含 INFO 和 DEBUG 日志记录语句,当使用较低日志级别部署时,这些语句不会包含在您的日志记录输出中。

如果您需要在当前实现中禁用日志记录,您可以使用 SetOutput(output io.Writer) 函数配置本机 go Logger 输出编写器。 log 包使用的默认WriterSTDERRioutil 包提供了一个顶级的Discard Writer,您可以使用它来防止记录器写入任何内容。您必须更新应用程序初始化以根据环境设置记录器的输出。

package main

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

func main() {
    var shouldEnableLogging bool = false

    if !shouldEnableLogging {
        fmt.Println("Disabled logging")
        log.SetOutput(ioutil.Discard)
    }

    for i := 0; i < 5; i++ {
        log.Printf("I logging statement %d", i)
    }
}

您可以调整此 sn-p 中的 bool 标志,以在 Go Playground 中的此代码中查看此操作。这将防止您的文件空间被日志填满,但您会同时丢失所有日志,这对于任何应用程序都是不可取的。

【讨论】:

  • SetOutput 函数还可以使用其他策略。您可以创建一个 n 大小的环形缓冲区,记录器可以写入该缓冲区并定期刷新到磁盘。这将允许您拥有记录器写入的最后 n 个字节。
  • 感谢您的详细回答。是的,我可能应该转向更详细的日志库。在我这样做之前,我很乐意使用 SetOutput 解决方法来解决我手头的情况。再次感谢!
猜你喜欢
  • 2019-03-16
  • 1970-01-01
  • 2011-07-10
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
相关资源
最近更新 更多