Записать журнал Golang Logger - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь записать журнал, используя log.Logger, мой код похож на приведенный ниже.Я не понимаю, почему мой журнал может быть записан с помощью функции Error внутри initLog, но в функции main он не может быть записан в файл журнала.
Может кто-нибудь объяснить мне?
Спасибо.

package main

import (
    "log"
    "net/http"
    "os"
)

const (
    PORT = ":8081"
)

var (
    Error *log.Logger
)

func initLog() {
    errorFile, err := os.OpenFile("error.log", os.O_RDWR|os.O_APPEND, 0660)
    defer errorFile.Close()

    if err != nil {
        log.Fatal(err)
    }

    Error = log.New(errorFile, "ERROR: ", log.Ldate|log.Ltime)
    Error.SetOutput(errorFile)
    Error.Println("Log error will be written into error.log")

}

func main() {
    initLog()
    Error.Println("Test write log")
    http.ListenAndServe(PORT, http.FileServer(http.Dir('.')))
}

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вы звоните defer errorFile.Close() в initLog().Как только initLog() вернет, выполняется отсрочка, и из-за этого, когда Error.Println("Test write log") вызывается в вашей основной сети, io.Writer уже закрыт.

Также вы должны сначала проверить ошибки, а затем вызватьdefer <what ever you need to do> как

errorFile, err := os.OpenFile("error.log", os.O_RDWR|os.O_APPEND, 0660)
if err != nil {
    log.Fatal(err)
}
defer errorFile.Close()
0 голосов
/ 10 декабря 2018

Вы закрываете файл при возврате из initLog(), используя defer errorFile.Close(), поэтому внутри main() файл errorFile закрыт.

Поэтому прокомментируйте эту строку:

defer errorFile.Close()

И переместите его на main().

...