2016-09-24 109 views
2

我已经使用Go 1.5.2盒式磁带在Openshift上部署了我的Go应用程序。作为一种良好的做法,我已经习惯于生成关于应用程序出现任何问题的日志。但是由于提供给我的存储空间有限(1 GB),这种习惯在Openshift环境中证明是昂贵的。在几秒钟的使用中,日志很容易超过10 MB的标记,并且我担心如果我未离开日志文件,我的应用程序将用尽空间。目前,我正在定期清理日志文件。停止将日志附加到go.log文件

有没有什么办法可以阻止日志附加到文件上,或者完全停止生成日志(不会影响我的原始应用程序代码)?我试图通过撤销文件的写入权限,但日志不断出现。

+0

你使用标准的go'log'包吗? –

+0

@BenCampbell是的。 –

+0

如果您正确地从'go.log'中删除写入权限,除非它足够聪明地'chmod'该文件,否则它不会写入。你可以试试'chmod 544'并检查写入是否仍然发生? –

回答

2

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

如果您需要在当前执行中禁用日志记录功能,则可以使用SetOutput(output io.Writer)函数配置本地输出写入器Loggerlog包使用的默认WriterSTDERRioutil包提供了顶级Discard编写器,您可以使用它来防止记录器写入任何内容。您将不得不更新应用程序初始化,以根据环境设置记录器的输出。

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

你可以在这个片断调整布尔标志,看到这个动作可以将这些代码的Go Playground。这会阻止你的文件空间填满日志,但是你会将所有日志放在一起,这对于任何应用程序都是不可取的。

+0

还有其他策略可以与'SetOutput'函数一起使用。您可以创建一个记录器可以编写的n大小的环形缓冲区,以便定期将其刷新到磁盘。这将允许您拥有记录器写入的最后n个字节。 –

+0

谢谢你的详细解答。是的,我应该转向更详细的日志记录库。在我这样做之前,我会很乐意使用SetOutput解决方法来解决我的问题。再次感谢! –