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.

instalowanie NLog'a z Nuget'a

instalowanie NLog’a z Nuget’a

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.