为了账号安全,请及时绑定邮箱和手机立即绑定

在 GO 中滚动日志文件的最佳方法

在 GO 中滚动日志文件的最佳方法

Go
潇潇雨雨 2021-12-27 15:20:08
在生产中使用 go 语言的人是否面临滚动日志文件的问题?有没有可能安全地滚动日志文件线程?是否有任何框架可以做到这一点?谢谢你。
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

我在https://github.com/natefinch/lumberjack 上取得了很好的成功,它是轻量级的,搭载在 golang 的标准和内存高效的“日志”pkg 上。


使用非常简单,只需添加一行代码即可设置,并正常使用日志:


log.SetOutput(&lumberjack.Logger{

    Filename:   "/var/log/myapp/foo.log",

    MaxSize:    500, // megabytes

    MaxBackups: 3,

    MaxAge:     28, //days

})


查看完整回答
反对 回复 2021-12-27
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

我倾向于采用12 Factor方法记录到 std 错误并让其他东西处理轮换。

然后,你可以选择系统旋转你的日志,如被提及这里


查看完整回答
反对 回复 2021-12-27
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

这是一个内部解决方案。您可以考虑让一个 goroutine 负责日志记录和日志轮换,并通过一个通道接收来自其他 goroutine 的日志。每当需要轮转时,goroutine 都会轮转日志,而来自其他 goroutine 的传入日志则在通道上排队。日志轮换完成后,它将使通道上的任何内容出列并继续记录。


类似的东西:


type Log struct {


    log string

    // other info you might want

}


// This will be your goroutine

func Logging(LogChannel chan Log) {


    // assume logger creates/opens a file and prepares it for writing  

    logger := New(logger) 


    for {


        // collect a log. Will also block until a log is available on the channel

        log <- LogChannel


        if timeToRotate() {


            RotateLogFile(logger)


        }


        // write log 

        logger.Log(log)

    }

}

编辑:在检查日志文件是否旋转后,先前的代码具有阻塞调用。最好把它放在timeToRotate函数调用之前,以防止在日志文件轮换后写日志的可能性


查看完整回答
反对 回复 2021-12-27
  • 3 回答
  • 0 关注
  • 820 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号