Próbuję pisać do pliku dziennika za pomocą Go.
Wypróbowałem kilka podejść, z których wszystkie zawiodły. Oto, czego próbowałem:
func TestLogging(t *testing.T) {
if !FileExists("logfile") {
CreateFile("logfile")
}
f, err := os.Open("logfile")
if err != nil {
t.Fatalf("error: %v", err)
}
// attempt #1
log.SetOutput(io.MultiWriter(os.Stderr, f))
log.Println("hello, logfile")
// attempt #2
log.SetOutput(io.Writer(f))
log.Println("hello, logfile")
// attempt #3
log.SetOutput(f)
log.Println("hello, logfile")
}
func FileExists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
func CreateFile(name string) error {
fo, err := os.Create(name)
if err != nil {
return err
}
defer func() {
fo.Close()
}()
return nil
}
Plik dziennika zostaje utworzony, ale nic nie jest drukowane ani do niego dołączane. Czemu?
Odpowiedzi:
os.Open()
musiało działać inaczej w przeszłości, ale to działa dla mnie:Na podstawie dokumentów Go,
os.Open()
nie działalog.SetOutput
, ponieważ otwiera plik „do czytania:”EDYTOWAĆ
Przeniesiony
defer f.Close()
do poif err != nil
sprawdzeniuźródło
f
może byćnil
, co spowoduje panikę. Dlategoerr
wskazane jest sprawdzenie przed odroczeniem połączenia.Open
nie chcesz pracować zlog.SetOutput
?Wolę prostotę i elastyczność 12-czynnikowej rekomendacji aplikacji do logowania. Aby dołączyć do pliku dziennika, możesz użyć przekierowania powłoki. Domyślny program rejestrujący w Go zapisuje do stderr (2).
Zobacz też: http://12factor.net/logs
źródło
$ cd /etc/systemd/system
$ sudo vi app.service ExecStart=/bin/bash -c 'sudo go run main.go >> /home/ubuntu/go/src/html_menu_1/logfile'
ja nie pracowałemUbuntu 18.04.3
Zwykle drukuję dzienniki na ekranie i również piszę do pliku. Mam nadzieję, że to komuś pomoże.
źródło
To działa dla mnie
utworzył pakiet o nazwie logger.go
zaimportuj paczkę wszędzie tam, gdzie chcesz się zalogować, np. main.go
źródło
Jeśli uruchamiasz plik binarny na komputerze z systemem Linux, możesz użyć skryptu powłoki.
nadpisać do pliku
dołączyć do pliku
nadpisz stderr do pliku
dołącz stderr do pliku
może być bardziej dynamiczny przy użyciu pliku skryptu powłoki.
źródło
Domyślny program rejestrujący w Go zapisuje do stderr (2). przekierowanie do pliku
źródło
Zadeklaruj najwyższy poziom w swoim globalnym,
var
aby wszystkie procesy miały dostęp w razie potrzeby.źródło
go version go1.10.2 windows/amd64
, jaka jest twoja?outfile, _ = os.Create("my.log")
i będzie działał zgodnie z oczekiwaniami.outfile, _ = os.Create("./path/to/my.log")
. Spodziewałem się, że kod utworzypath/to
foldery imy.log
plik, ale najwyraźniej nie zadziałało. Proponuję zmodyfikować swoją odpowiedź na „be”outfile, _ = os.Create("./my.log")
. W ten sposób wyraźnie wiemy, że tworzy dziennik w bieżącym folderze.Opierając się na odpowiedzi Allison i Deepak, zacząłem używać Logrusa i bardzo mi się podoba:
Mam odroczenie f.Close () w głównej funkcji
źródło
Piszę logi do plików, które są generowane codziennie (dziennie generowany jest jeden plik dziennika). To podejście działa dobrze dla mnie:
Metoda „shortenFilePath ()” używana do pobierania nazwy pliku z pełnej ścieżki do pliku. i metoda „LogServer ()” służy do tworzenia sformatowanej instrukcji dziennika (zawiera: nazwę pliku, numer wiersza, poziom dziennika, opis błędu itp.)
źródło
Aby pomóc innym, tworzę podstawową funkcję dziennika do obsługi rejestrowania w obu przypadkach, jeśli chcesz, aby wyjście było na standardowe wyjście, włącz debugowanie, po prostu wykonuję flagę przełącznika, abyś mógł wybrać wyjście.
źródło
może to ci pomoże (jeśli plik dziennika istnieje, użyj go, jeśli nie istnieje, utwórz go):
Więcej szczegółów: https://su9.co/9BAE74B
źródło