在golang中封装日志设置的正确模式

在golang中封装日志设置的正确模式,第1张

概述当尝试将日志设置代码移动到单独的函数时,我遇到无法从主函数隐藏目标文件对象.在下面的INCORRECT简化示例中,尝试通过单个函数调用设置日志写入Stderr和文件: package mainimport ( "io" "log" "os")func SetupLogging() { logFile, err := os.OpenFile("test.lo 当尝试将日志设置代码移动到单独的函数时,我遇到无法从主函数隐藏目标文件对象.在下面的INCORRECT简化示例中,尝试通过单个函数调用设置日志写入Stderr和文件:

package mainimport (    "io"    "log"    "os")func SetupLogging() {    logfile,err := os.Openfile("test.log",os.O_APPEND|os.O_CREATE,0666)    if err != nil {        log.Panicln(err)    }    defer logfile.Close()    log.Setoutput(io.MultiWriter(os.Stderr,logfile))}func main() {    SetupLogging()    log.Println("Test message")}

显然是不起作用,因为defer在SetupLogging函数结束时关闭日志文件.

下面的一个工作示例添加了额外的代码,如果在较大的应用程序中重复作为模式,IMHO会失去一些清晰度:

package mainimport (    "io"    "log"    "os")func SetupLogging() *os.file {    logfile,0666)    if err != nil {        log.Panicln(err)    }    log.Setoutput(io.MultiWriter(os.Stderr,logfile))    return logfile}func main() {    logf := SetupLogging()    defer logf.Close()    log.Println("Test message")}

有没有不同的方法将打开文件管理完全封装到一个函数中,但仍然很好地释放句柄?

解决方法 我现在已经成功地在多个项目中使用了以下方法大约一年.我们的想法是从设置调用中返回一个函数.结果函数包含销毁逻辑.这是一个例子:

package mainimport (    "fmt"    "io"    "log"    "os")func LogSetupAndDestruct() func() {    logfile,os.O_CREATE|os.O_APPEND|os.O_RDWR,logfile))    return func() {        e := logfile.Close()        if e != nil {            fmt.Fprintf(os.Stderr,"Problem closing the log file: %s\n",e)        }    }}func main() {    defer LogSetupAndDestruct()()    log.Println("Test message")}

它正在使用一个关闭清理逻辑的闭包.

使用这种方法的更详细的公开示例在Viper代码中:here is the return from a test initializer和here it is used to encapsulate the cleanup logic and objects

总结

以上是内存溢出为你收集整理的在golang中封装日志设置的正确模式全部内容,希望文章能够帮你解决在golang中封装日志设置的正确模式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1264993.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存