2017-02-02 21 views
1

我正在嘗試爲我的代碼創建日誌文件。但是我無法將所有日誌語句寫入文件。無法將所有日誌語句寫入文件

這裏是我的代碼:

func MyLogger() { 
    f, err := os.OpenFile("C:\\Project\\GoLang\\src\\Logs\\LogOutput\\TestLog.log", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666) 
    if err != nil { 
     log.Fatalf("error opening file: %v", err) 
    } 
    defer f.Close() 
    log.SetOutput(f) 
    log.Println("This is a test log entry") 
} 

回答

4

的問題是,你打開它後立即關閉日誌文件。

你打電話給log.SetOutput(logFile),但你也叫defer logFile.Close()。只要函數MyLogger()退出,延遲就會執行 - 所以在您有機會實際記錄任何內容之前。

如果您的記錄器將在整個程序期間運行,那麼您可能根本不需要關閉它,並在程序退出時讓它自動關閉。

如果您確實需要在程序退出前關閉它,您需要想出一些方法來將該文件句柄存儲在MyLogger()方法之外(可能在全局變量中,儘管有其他選項),然後在適當的時候關閉它。

一個完整的例子:

package Controllers 

import (
    "log" 
    "os" 
    "io" 
) 

var logCloser io.Closer 

func MyLogger() { 
    logFile, err := os.OpenFile("C:/Project/GoLang/src/Logs/log.txt", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666) 
    if err != nil { 
     panic(err) 
    } 
    logCloser = logFile 
    log.SetOutput(logFile) 
} 

func CloseMyLogger() { 
    logCloser.Close() 
}