2016-05-16 10 views
0

私はいくつかのエラー情報をファイルに記録しているかなりシンプルなコードをいくつか持っています。グローバル変数のときにネイティブGolangロガーがログに記録されないのはなぜですか?

package main 

import (
    "log" 
    "os" 
) 

var testLogger *log.Logger 

func init() { 
    logFile, openErr1 := os.OpenFile("/home/doug/logs/test.log", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666) 

    if openErr1 != nil { 
     log.Println("Uh oh! Could not open log file.") 
    } 

    defer logFile.Close() 

    testLogger = log.New(logFile, "PREFIX", log.Lshortfile|log.Ldate|log.Ltime) 
} 

func main() { 
    testLogger.Println("meep meep") 
} 

ただし、プログラムを実行した後にファイルを開くときは、常に空です。私は間違って何をしていますか?

+2

'defer logFile.Close()'はinit関数の最後に実行されませんか?あなたがロガーの下からファイルを閉じようとしているのではないのですか? –

+0

@ChrisTavares GAH。ですから、私は 'main()'でそれを実行する必要がありますか? –

+0

@DougSmithは、遅延をメインに置いて残りを残すことはできません。すべてのログ設定をメインワークの先頭に移動するなど、ここに示唆されているようにhttps://stackoverflow.com/questions/32619318/logging-to-a-file-in-golang – Snowman

答えて

2

Dougは既に指摘したように、init()関数は常にmain()の前に呼び出され、順番に呼び出されます。つまり、init()が終了すると、deferinit()のキューに入れられます。この場合はログが閉じます。

ほとんどの場合、log.Close()に電話することはほとんどありません。したがって、あなたはあなたがいないlog.Close()に標準libに力を言うかもしれないos.Exit

https://golang.org/src/log/log.go?s=9087:9131#L295

とドキュメント明示的defer sが

// Exit causes the current program to exit with the given status code. 
// Conventionally, code zero indicates success, non-zero an error. 
// The program terminates immediately; deferred functions are not run. 
func Exit(code int) { 

を実行していないと言う。log上のすべてのFatal機能がos.Exitすることに注意してください致命的なエラーの場合。それは大したことではないことを示唆している。

ただし、終了する前にPanic関数はdeferの赤い関数を実行することに注意してください。

関連する問題