Poprzedni artykuł: .NET Core - log4net: wprowadzenie był wprowadzeniem do tematu tworzenia dzienników zdarzeń przy pomocy biblioteki log4net. W tej części rozwiniemy poprzedni artykuł oraz skupimy się na najepszych praktykach stosowanych przy pracy nad dziennikami zdarzeń. Poniżej 8 najważnieszych punktów, którymi warto się kierować.
- Nie wysyłaj logów do bazy danych korzystając z AdoAppender - próba wysyłania dziennika zdarzeń do bazy danych może być niezwykle trudna jeżeli pracujesz na dużym wolumenie danych. W takim wypadku zdecydowanie lepiej wysyłać swoje dane do dziennika zdarzeń jakim jest np. https://www.elastic.co/. Serwis ten przetwarzana dane w czasie rzeczywistym i pozwoli (przez odpowiednią konfigurację) na zdecydowanie lepsze zarządzanie dziennikiem zdarzeń.
- Nie wysyłaj wiadomości email za każdym razem, gdy dojdzie do wygenerowania błędu. Takie podejście może doprowadzić do przyszłego zignorowania lub też przeoczenia błędu a w konsekwencji do poważnych problemów. Może się przecież zdarzyć, w przypadku awarii, że dojdzie do nagłego wysyłania setek błędów (a w konsekwencji i wiadomości email). W poprzedniej cześci artykułu pisałem o niezwykle istotnym podejściu do zaplanowania hierarchii naszego dziennika zdarzeń – a w konswekcji do różnych poziomów logowania wiadomości. Przed wysłaniem wiadomości warto rozważyć jakie informacje są dla nas istotne i kto powinien być adresatem wiadomości. Wiadomości możemy wysyłać za pomocą SmtpAppander.
- Jak wysyłać ostrzeżenia o wyjątkach? Jeżeli zależy Ci na wysyłaniu wyjątków warto zastanowić się nad narzędziami do śledzenia błędów. Jednym z takich narzędzi, wspierających platformę .NET jest https://rollbar.com/. Narzędzia takie pozwalają na śledzenie błędów, śledzenie ich historii, częstości wystąpienia, itd. Pozwalają również wysyłać powiadomienia jeżeli błąd jest krytyczny i/lub nowy. Może się zdarzyć, że dzaiałająca aplikacja wysyła powtarzający się błąd, który został już naprawiony – aplikacja czeka jedynie na udostępnie na serwerze produkcyjnym (taki błąd można odpowiednio oznaczyć i nie wysyłać powiadomienia).
- Wysyłaj swoje logi do systemu zarządzania dziennikami. Przechowywanie dzienników w plikach na dysku twardym jest dobrym i wygodnym rozwiązaniem. Jeżeli jednak chcesz przeszukać swoje dzienniki na wielu serwerach i aplikacjach musisz wysyłać je do centralnego repozytorium. Istnieje wiele narzędzi, które mogą Ci w tym pomóc. Jeżeli chesz poczytać o takich systemach kliknij tutaj.
- Używaj filtrowania, aby wyłączyć niektóre typy logowania wiadomości. Filtry można tak skonfigurować, aby np. na serwerze produkcyjnym logować tylko najistotniejsze błędy. Jeżeli chesz poznać dostępne typy w bibliotece log4net kliknij tutaj. Przykład odpowiednio zmodyfikowanego pliku konfiguracyjnego znajduje się tutaj.
- Możesz utworzyć swój własny, niestandardowy, typ loggera. Jeżeli podstawowa funkcjonalność jest dla Ciebie niewystarczająca możesz zaimplementować swój własny typ loggera. Jednym z przykładów, który możesz znaleźć w Internecie jest logger napisany dla usługi Azure Storage.
-
Dopasuj układ informacji w dzienniku zdarzeń za pomocą tzw. Pattern Layouts (menadżer wzorów). Możesz odpowiednio zmodyfikować plik konfiguracyjny, aby wskazać, które pola wyświetlane są w jaki sposób. Szczegółowe informacje znajdują się pod tym adresem: https://logging.apache.org/log4net/log4net-1.2.13/release/sdk/log4net.Layout.PatternLayout.html. Przykładem takiej konfiguracji jest poniższy wpis:
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="plukasiewicz.log" /> <param name="AppendToFile" value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="12" /> <maximumFileSize value="8MB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%-10p %d{MM-dd hh:mm:ss.ffff} [%thread] %m%n" /> </layout> </appender>
-
Używaj kontekstów, aby dodawać dodatkowe pola. Kontekstów możemy używać, aby dodać więcej informacji o użytkowniku, kliencie lub transakcji związanej z daną operacją. Poniżej prosty przykład dodający nową właściwość "uzytkownik":
log4net.ThreadContext.Properties["uzytkownik"] = "Paweł";
Kolejnym krokiem jest modyfikacja naszego pattern layout w postaci: %property{uzytkownik}. Dzięki tej modyfikacji w dzienniku zdarzeń zostaną wyświetlone dodatkowe informacje.