Najlepsze praktyki

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ć.

  1. 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ń.
  2. 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.
  3. 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).
  4. 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.
  5. 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.
  6. 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.
  7. 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>
    
  8. 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.

Podsumowanie

W powyższym artykule udało się wymienić 8 najważniejszych wytycznych, które należy mieć na uwadze używając biblioteki log4net. Jest ona niezwykle pomocna przy tworzeniu dziennika zdarzeń, posiada wiele ustawień konfiguracyjnych a sama dokumentacja jest przygotowana w przejrzysty sposób. Bibioteka jest ciągle rozwijana i wspierana przez społeczność programistów.