Blog Dla Młodszych Programistów C#/.NET

15 września 2020
W poprzednim artykule na blogu poruszyłem temat obsługi wyjątków w C#. Przedstawiłem Ci kilka popularnych, często używanych przez programistów sposobów rzucania wyjątków. Wtedy również wspomniałem o tym, że jeżeli chcemy dobrze obsłużyć wyjątek, to powinniśmy koniecznie, zapisać o nim szczegółowe informacje na przykład do pliku. Nie powinniśmy dopuszczać do takich sytuacji, że w catch'u nie ma zapisywania tego błędu. Jak najlepiej to zrobić? Programiści .NET mają do wyboru mnóstwo bibliotek, dzięki którym mogą zapisywać takie logi do plików. Czy powinniśmy użyć jednej z tych bibliotek? Jeżeli tak, to której? Jak takie logi zapisywać? A może jednak powinniśmy napisać swojego loggera, który będzie takie informacje zapisywał do pliku? Na te wszystkie pytania znajdziesz odpowiedź w tym artykule.

Proste Logowanie Danych Do Pliku w C# Za Pomocą Biblioteki NLog


Własny logger?


Przede wszystkim moim zdaniem nie powinieneś pisać nowego, własnego loggera, własnej biblioteki, która będzie zapisywała takie logi. Dlaczego? Jest kilka powodów. Po pierwsze, napisanie własnego loggera będzie wymagało od Ciebie dużo pracy, także będziesz na to musiał poświecić sporo czasu, który mógłbyś poświęcić na pisanie już swojej aplikacji. Po drugie, skoro już są dostępne jakieś rozwiązania, darmowe biblioteki, to na pewno korzysta z nich sporo innych programistów, a co za tym idzie, są one przez nich dobrze przetestowane, więc prawdopodobnie już dobrze działają. Jeżeli napiszesz swoją bibliotekę, to na pewno z czasem będą wychodzić jakieś błędy, które będziesz musiał poprawiać, raczej nie będzie ona od razu niezawodna. Także, wydaje mi się, że przynajmniej z punktu widzenia biznesowego nie ma sensu pisać takiej biblioteki do własnego użytku od zera, lepiej użyć gotowego rozwiązania. Co innego, jeżeli chcesz napisać taką bibliotekę, nie w celach biznesowych, ale by podnieść swoje umiejętności, to wtedy jak najbardziej może to być dobry pomysł. Na pewno napisanie takiej biblioteki Ci w tym pomoże.


Jaką bibliotekę do logowania wybrać?


W takim razie, którą bibliotekę do logowania danych wybrać? Jest sporo dobrych darmowych bibliotek, które możesz użyć w swojej aplikacji. Między innymi są to: NLog, log4net, serilog, oraz elmah. Moim zdaniem każda z nich jest dobra, ja jednak najczęściej używam NLog'a, chociaż pozostałe są również dobre. Poniżej przykłady będą właśnie napisane przy użyciu biblioteki NLog.


Instalacja i konfiguracja NLoga


NLog ma całkiem dobrze napisaną dokumentację, także na początek polecam Ci się z nią zapoznać. Znajdziesz tam również kilka przykładów użycia. W celu dodania biblioteki NLog do projektu napisanego w C# zainstaluj za pomocą NuGeta następujące pakiety: NLog, NLog.Schema oraz NLog.Config. Po instalacji do projektu powinien zostać dodany plik NLog.config oraz NLog.xsd. Zanim zaczniesz zapisywać dane, powinieneś uzupełnić właśnie konfiguracje w pliku NLog.config. Jest tam sporo komentarzy opisujących jak zrobić to poprawnie, możesz na początek spróbować takiej konfiguracji:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
  
 <targets>
    <target 
      xsi:type="File" 
      name="error" 
      fileName="${basedir}/logs/error/${shortdate}.log"
      layout="${longdate} ${uppercase:${level}} ${message}" />
    
    <target 
      xsi:type="File"             
      name="info" 
      fileName="${basedir}/logs/info/${shortdate}.log"            
      layout="${longdate} ${uppercase:${level}} ${message}" />
  </targets>
  
  <rules>
    <logger 
      name="*" 
      minlevel="Error" 
      writeTo="error" />
        
    <logger 
      name="*" 
      minlevel="Info"
      maxlevel="Warn" 
      writeTo="info" />
  </rules>
  
</nlog>

Dzięki takiej konfiguracji w folderze z aplikacją zostanie utworzony folder logs, a w nim 2 kolejne, to znaczy error, w którym będą zapisywane błędy aplikacji, a także info, w którym będą zapisywane logi informacyjne, oraz ostrzeżenia. Wszystkie logi będą zapisywane do plików tekstowych. W nazwie będą zawierały aktualną datą oraz rozszerzenie log. W łatwy sposób możesz rozdzielić logi w zależności od ich typu.


Jak zapisywać logi w aplikacji:


Poniżej znajduje się kod, użyty w aplikacji konsolowej .NET framework:
namespace App
{
    class Program
    {
        private static NLog.Logger _logger = 
            NLog.LogManager.GetCurrentClassLogger();
        static void Main(string[] args)
        {
            _logger.Info("Application started...");

            try
            {
                //...
            }
            catch (Exception ex)
            {
                _logger.Error(ex);
                throw;
            }
            finally
            {
                _logger.Info("Application stopped...");
            }
        }
    }
}

Na początku inicjalizujemy statyczne pole prywatne _logger, klasy Logger, oczywiście z biblioteki NLog. W wywołaniu metody Main najpierw zapisujemy informacje o tym, że aplikacja wystartowała, oraz w bloku finally dodajemy do pliku log, że aplikacji zakończyła działania. Te 2 logi zostaną umieszczone w folderze info i będą miały taką postać:
2020-09-15 17:19:17.6081 INFO Application started...
2020-09-15 17:19:17.6381 INFO Application stopped...

Z kolei, jeżeli wystąpi wyjątek w bloku try, to log z błędem zostanie zapisany w odpowiednim pliku, w folderze error. Przykładowy zapis takiego loga:
2020-09-15 17:19:39.1021 ERROR System.Exception: exception
   at MyApp.Program.Main(String[] args) in C:\App\Program.cs:line 19


PODSUMOWANIE:


Jak widzisz, nie ma potrzeby tworzenia własnego loggera. Obecnie mamy do wyboru mnóstwo darmowych bibliotek, które możemy używać w C#. Wymagają one tylko poświęcenia kilku minut na przygotowanie odpowiedniej konfiguracji, a następnie możesz w łatwy sposób logować różne informacje do pliku. Dzięki temu, jeżeli wystąpi jakiś błąd w Twojej aplikacji, będziesz mógł go łatwo zdiagnozować. Daj znać, czy używasz w swoich projektach właśnie NLoga, czy może u Ciebie sprawdziła się jakaś inna biblioteka? Podziel się, proszę swoimi doświadczeniami :)

Poprzedni artykuł - Proste Zasady, o Których Musisz Pamiętać, Podczas Obsługi Wyjątków w C#.
Następny artykuł - Metody Rozszerzające w C#, Czyli Jak w Łatwy Sposób Rozszerzyć Już Istniejący Typ.
Autor artykułu:
Kazimierz Szpin
Kazimierz Szpin
Programista C#/.NET. Specjalizuje się w ASP.NET Core, ASP.NET MVC, ASP.NET Web API, Blazor, WPF oraz Windows Forms.
Autor bloga ModestProgrammer.pl
Komentarze (2)
Nuno
NUNO, 5 maja 2022 10:19
U mnie akurat jest to Serilog, ale bardziej z przyzwyczajenia, niż świadomego wyboru.
Kazimierz Szpin
KAZIMIERZ SZPIN, 5 maja 2022 18:06
Cześć @NUNO. Dokładnie, tak to często wygląda :) Czasem też firma z góry narzuca bibliotekę do logowania. Moim zdaniem Serilog również jest jak najbardziej dobrym wyborem.
Dodaj komentarz

Wyszukiwarka

© Copyright 2024 modestprogrammer.pl. Wszelkie prawa zastrzeżone. Regulamin. Polityka prywatności. Design by Kazimierz Szpin