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.