
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中封装日志设置的正确模式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)