Регистратор не может писать при вызове в других функциях - PullRequest
0 голосов
/ 28 июня 2018

Примечание: новичок для языка голанг

Вот пример программы hello.go, которую я написал для проверки поведения, и я вижу проблему, из-за которой я не вижу ничего записываемого Logger ни в каких функциях, кроме init ().

package main  
import (
    "fmt"
    "os"
    "io"
    "log"
)  
var (
  testLogger *log.Logger
)  
func init() {
    test_log := "/tmp/t1.log"
    fmt.Printf("Logs are saved to %v\n", test_log)
    f, err := os.OpenFile(test_log, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
    if err != nil {
        fmt.Printf("ERROR  Can't create log file! Reason: %v \n", err)
        os.Exit(1)
    }
    defer f.Close()
    multiWriter := io.MultiWriter(f)
    testLogger = log.New(multiWriter, "", log.Ldate|log.Ltime|log.Lshortfile)
    testLogger.Printf("in init..")
}  
func main() {
    pretest()
    test()
    testLogger.Printf("Back to main ... ")
}  
func pretest() {
    testLogger.Printf("In pretest ... ")
}  
func test() {
  testLogger.Printf("in test..")    
}

Вот вывод и содержимое файла, в который производится запись:

➜ ./hello
Журналы сохраняются в /tmp/t1.log
➜ cat /tmp/t1.log
2018/06/28 11:23:25 hello.go: 27: в init ..

AFAIK, testLogger, совместно используемый в одном и том же пакете, должен быть доступен для каждой функции и может использоваться. Пожалуйста, поправьте меня, если мое понимание неверно? Я что-то упустил в коде? Пожалуйста, укажите какой-либо указатель или ссылку на этот вопрос? Спасибо.

1 Ответ

0 голосов
/ 28 июня 2018
defer f.Close()

Вы делаете это defer в функции init, что означает, что файл будет закрыт, как только завершится функция init.

Поскольку функция init запускается до main, файл будет закрыт уже при попытке записи из всех других функций.

Переместите defer в основную функцию, чтобы она закрывалась при выходе из программы.

Обратите внимание, что в этом конкретном случае вам даже не нужно закрывать os.File, так как по умолчанию File имеет finalizer для закрытия, когда он собирается GC (см. Здесь функцию newFile: https://golang.org/src/os/file_unix.go).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...