我Logger
在utils包的init()
方法中创建了Global 。
```
package utils
var Logger *log.Logger
func init() {
logFile, _ := config.Configure.String("log_file")
if len(logFile) == 0 {
appRoot, _ := os.Getwd()
logFile = filepath.Join(appRoot, "app_runtime.log")
}
f, err := os.OpenFile(logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
//Look HERE!!!
if err != nil {
panic(err)
}
Logger = log.New()
//Log as JSON
Logger.Formatter = &log.JSONFormatter{}
//Output to stdout
//When production, use file
Logger.Out = f
// Only log the debug severity or above.
Logger.Level = log.DebugLevel
}
```
因此,我可以这样使用它:
utils.Logger.Info("This is debug info")
我的问题是:我应该关闭日志文件吗?怎么样?
默认情况下,os.File
将在应用程序退出时由垃圾收集器(GC)完成。来自SetFinalizer
文档
obj的终结器计划在obj不可访问之后的任意时间运行。无法保证终结器会在程序退出之前运行,因此通常它们仅对在长时间运行的程序期间释放与对象关联的非内存资源有用。例如,当程序在不调用Close的情况下丢弃os.File时,os.File对象可以使用终结器关闭关联的操作系统文件描述符,但是依靠终结器来刷新内存中的I是错误的/ O缓冲区,例如bufio.Writer,因为该缓冲区不会在程序退出时刷新。
如果您不想依赖GC,则可以main
按如下所示在函数中手动将其关闭:
func main() {
//Close log writer when exit
defer func(){
if file, ok := Logger.Out.(*os.File); ok {
file.Sync()
file.Close()
} else if handler, ok := Logger.Out.(io.Closer); ok {
handler.Close()
}
}()
//Your original codes
//...
}
在上面的代码中,我们使用defer
语句来确保在应用程序退出时关闭处理程序。由于Logger.Out
可能定义为io.Writer
,因此我们需要测试是否Logger.Out
也实现io.Closer
,如果是,则将其关闭。如果Logger.Out
为os.File
,我们还将调用Sync()
以确保所有内容都已写入磁盘。
编辑
报价文档,并添加file.Sync()
以确保将文件内容写入磁盘。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句