- Stwórz pojedynczy dziennik, zarejestruj się i przekaż go innym?
To jest możliwe. Log.Logger może być stosowany równocześnie z wielu goroutines.
- Przekaż wskaźnik do tego dziennika.
log.New zwraca a, *Logger
co zwykle wskazuje, że należy przekazać obiekt jako wskaźnik. Przekazanie go jako wartości spowodowałoby utworzenie kopii struktury (tj. Kopii Loggera), a następnie wiele goroutines mogło pisać jednocześnie do tego samego io.Writer . To może być poważny problem, w zależności od implementacji pisarza.
- Czy każdy goroutine lub funkcja powinien tworzyć rejestrator?
Nie stworzyłbym osobnego rejestratora dla każdej funkcji lub goroutine. Gorutyny (i funkcje) są używane do bardzo lekkich zadań, które nie uzasadniają utrzymywania oddzielnego rejestratora. Prawdopodobnie dobrym pomysłem jest utworzenie rejestratora dla każdego większego komponentu projektu. Na przykład, jeśli Twój projekt korzysta z usługi SMTP do wysyłania wiadomości, utworzenie osobnego programu rejestrującego dla usługi pocztowej wydaje się dobrym pomysłem, aby można było oddzielnie filtrować i wyłączać dane wyjściowe.
- Czy powinienem utworzyć rejestrator jako zmienną globalną?
To zależy od twojego pakietu. W poprzednim przykładzie usługi pocztowej dobrym pomysłem byłoby posiadanie jednego rejestratora dla każdej instancji Twojej usługi, aby użytkownicy mogli rejestrować awarie podczas korzystania z usługi poczty Gmail inaczej niż awarie, które wystąpiły podczas korzystania z lokalnego MTA (np. Sendmail ).
io.Writer
interfejs i zmienisz dane wyjściowe domyślnego rejestratora za pośrednictwemSetOutput()
.To jest prosty rejestrator
Możesz to wykorzystać w ten sposób
źródło
Wiem, że to pytanie jest trochę stare, ale jeśli, tak jak ja, twoje projekty składają się z wielu mniejszych plików, głosuję na twoją czwartą opcję - stworzyłem to,
logger.go
co jest częścią pakietu main. Ten plik go tworzy rejestrator, przypisuje go do pliku i udostępnia pozostałej części pliku main. Uwaga Nie znalazłem wdzięcznego sposobu na zamknięcie dziennika błędów ...źródło
defer errorlog.Close()
pod koniec realizacji, lub w celu lepszego zapewnienia jego zamknięte, ustanowione obsługi sygnałów za pomocą iść za pakiet sygnał golang.org/pkg/os/signalTo jest starsze pytanie, ale chciałbym zasugerować użycie http://github.com/romana/rlog (który opracowaliśmy). Jest konfigurowany za pomocą zmiennych środowiskowych, obiekt rejestrujący jest tworzony i inicjowany podczas importowania rlog. Dlatego nie ma potrzeby omijania rejestratora.
rlog ma kilka funkcji:
Jest bardzo mały, nie ma żadnych zewnętrznych zależności, z wyjątkiem standardowej biblioteki Golang i jest aktywnie rozwijany. Przykłady podano w repozytorium.
źródło
Znalazłem domyślny pakiet dziennika ( https://golang.org/pkg/log/ ) nieco ograniczający. Na przykład brak obsługi dzienników informacji i debugowania.
Po krótkich poszukiwaniach zdecydowałem się na użycie https://github.com/golang/glog . Wydaje się, że jest to port https://github.com/google/glog i zapewnia przyzwoitą elastyczność w logowaniu. Na przykład, gdy aplikacja jest uruchamiana lokalnie, możesz potrzebować dziennika poziomu DEBUG, ale możesz chcieć uruchomić tylko na poziomie INFO / ERROR w środowisku produkcyjnym. Lista pełnych funkcji / przewodnika znajduje się tutaj https://google-glog.googlecode.com/svn/trunk/doc/glog.html (dotyczy modułu c ++, ale w większości przekłada się na port golang)
źródło
Jednym z modułów rejestrowania, który możesz wziąć pod uwagę, jest klog . Obsługuje rejestrowanie „V”, co zapewnia elastyczność logowania na określonym poziomie
klog to rozwidlenie glogu i przezwycięża następujące wady
Przykładowe wdrożenie
źródło