NLog, Log4net, Logging Application Block z Enterprise Library to chyba trzy najbardziej popularne loggery wśród programistów .net. Każdy z nich ma pewne pozytywne czy to negatywne cechy, które wyróżniają go na tle innych. W dzisiejszym poście skoncentruję się jednak na NLog’u zaczynając od samego początku.
Do solucji za pomocą NuGet’a dodajmy poniższą paczkę Nlog oraz Nlog Configuration.
Ważne jest aby plik w którym umieścimy naszą konfigurację (np. NLog.config) miał ustawioną właściwość Copy to Output Directory na Copy always. Teraz nasza aplikacja będzie mogła używać naszych ustawień.
Lokalizacja pliku konfiguracji
W tym miejscu należy wspomnieć, iż plik z ustawieniami może być lokalizowany z paru miejsc w zależności od rodzaju aplikacji. W przypadku aplikacji stand-alone (.exe) wygląda to następująco:
- Plik standardowych ustawień aplikacji (zazwyczaj appname.exe.config)
- Plik appname.exe.nlog w katalogu aplikacji
- Plik NLog.config w katalogu aplikacji
- Plik NLog.dll.nlog w katalogu gdzie umieszczona jest biblioteka NLog.dll, o ile biblioteka ta nie jest zainstalowana w GAC’u
Podobnie wygląda sytuacja w aplikacjach webowych (ASP.NET):
- Plik ustawień aplikacji (web.config)
- Plik web.nlog umieszczony w tym samym katalogu co plik web.config
- Plik NLog.config w katalogu aplikacji
- Plik NLog.dll.nlog w katalogu gdzie umieszczona jest biblioteka NLog.dll, i ile biblioteka ta nie jest zainstalowana w GAC’u
Konfiguracja
Konfigurację NLoga skupię się opisując 3 jego podstawowe sekcje: targets, rules i variable. A wiec zaczynam…
<targets/>
Jest sekcją wymaganą. To właśnie w niej jak nazwa wskazuje konfigurujemy cel naszego loga(czy ma być on zapisywany w pliku, w bazie danych wyświetlany w konsoli, czy może ma być on wysyłany przez sieć).
Istnieje wiele możliwości definiowania źródła target’u. Lista dostępnych dla NLog’a znajduje się tu. Każda z sekcji posiada własne atrybuty, które pomagają nam w jej konfiguracji.
<targets async="true"> <target name="f" xsi:type="File" fileName="${basedir}/logs/log.txt" archiveFileName="${basedir}/logs/archives/log.{#####}.txt" archiveAboveSize="10240" archiveNumbering="Rolling" keepFileOpen="false"/> </targets>
Powyższy przykład archiwizuje pliki gdy ich wielkość przekroczy wartość pola archiveAboveSize wyrażonego w bajtach. Z kolei ustawienie pola archiveNumbering na wartość „Rolling” powoduje zapis najnowszego pliku archiwum pod nazwą „log.00000.txt” i przesunięcie już istniejących o wartość 1.
Sekcja <target> oferuje jednak o wiele więcej. To w niej możemy dodać atrybut layout w którym definiujemy w jakim formacie chcemy logować informacje. Domyślny format, który niektórym z nas może być wystarczający wygląda następująco:
<target name="f" xsi:type="File" fileName="logfile.txt" layout="${longdate}|${level:uppercase=true}|${logger}|${message}"/>
Natomiast wykaz wszystkich możliwych zmienny dla ciekawych, można znaleźć pod tym linkiem.
<rules/>
Jest drugą i ostatnia wymaganą sekcją konfiguracji NLog’a, w której ustawiamy przepływ/warunki logowania. Elementy w tej sekcji noszą nazwę <logger/> i akceptują poniższe atrybuty:
- name – źródło a zarazem nazwa logger’a(np. „Program. NLogProject”, „*”)
- minlevel – minimalny poziom logu dla którego pasuje ta reguła
- maxlevel – maksymalny poziom logu dla którego pasuje ta reguła
- level – pojedyńczy poziom logu dla którego pasuje reguła
- levels – lista poziomów logu oddzielona przecinkiem dla którego pasuje reguła
- writeTo – lista target’ów oddzielona przecinkami, które będą użyte podczas reguły
- final – ustawia na wartość true powoduje, że żadna inna reguła nie będzie wykonana, gdy obecna reguła pasuje
A to lista dostępnych poziomów(levels):
- Off
- Fatal
- Error
- Warn
- Info
- Debug
- Trace
Jeżeli chcemy zapisywać wszystkie możliwe wiadomości do naszego pliku, nasza reguła wyglądałaby tak:
<logger name="*" minlevel="Trace" writeTo="f" />
Jeżeli jednak chcemy zapisać wiadomości o poziomie Warn, Error i Fatal ze wszystkich klas z namespace NLogProject wystarczy dodać taki wpis:
<logger name="NLogProject.*" minlevel="Warn" maxlevel="Fatal" writeTo="f" />
<variable/>
Sekcja ta służy do definiowania zmiennych używanych w dalszej definicji NLog’a.
<variable name="logProcess" value="${windows-identity}|${processid}"/> <targets> <target name="f" xsi:type="File" fileName="logfile.txt" layout="${longdate}|${level }|${logger}|${message}|${logProcess}"/> </targets>
To tyle na temat konfiguracji. Jeśli macie potrzebę głębszego wglądu w konfigurację NLog’a to zachęcam do odwiedzenia strony na github’ie.
Użycie NLog’a
Samo użycie NLog’a w kodzie sprowadza się już tylko do 3 rzeczy:
- Dodanie using’u NLog
- Stworzenie instancji naszego loggera
- Zapisanie informacji do loggera
Najlepiej zobrazuje to trywialny fragment poniższego kodu.
using NLog; namespace NLogProject { public class Program { static Logger logger = LogManager.GetCurrentClassLogger(); static void Main(string[] args) { logger.Trace("Trace message"); logger.Debug("Debug message"); logger.Info("Informational message"); logger.Warn("Warning message"); logger.Error("Error message"); logger.Fatal("Fatal error message"); } } }
To co mi najbardziej się podoba w NLog’u to prostota, mam na myśli tu inicjalizację loggera, gdzie wystarczy stworzyć obiekt metodą GetCurrentClassLogger(), jak również same ustawienia w XML które są czytelne i intuicyjne.
Na dziś to wszystko, dziękuję za uwagę. W następnym poście skupię się na kolejnym loggerze jakim jest log4Net.