Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在golang中封装日志设置的正确模式大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当尝试将日志设置代码移动到单独的函数时,我遇到无法从主函数隐藏目标文件对象.在下面的INCORRECT简化示例中,尝试通过单个函数调用设置日志写入Stderr和文件

package main

import (
    "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 main

import (
    "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")
}

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

解决方法

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

package main

import (
    "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")
}

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

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

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。