Wprowadzenie
Artykuł ten jest nawiązaniem do poprzednich artykułów związanych z biblioteką Log4Net. Adresy poprzednich artykułów możecie znaleźć poniżej:
W tej części skupimy się na nieco bardziej skomplikowanym zagadnieniu jakim jest logowanie w aplikacji ASP.NET Core.
Gorąco zachęcam do zapoznania się z artykułem wprowdzającym gdzie omówione są podstawy tworzenia pliku konfiguracyjnego biblioteki log4net. Podstawy te są niezwykle istotne ponieważ w przypadku aplikacji ASP.NET Core zamierzony rezultat osiągamy w nieco odmienny sposób.
Aplikacja ASP.NET Core
Informacje zawarte w momencie pisania artykułu są aktualne. Mam tutaj na myśli szereg zmian związany z biblioteką, wsparcie i sugestię różnych programistów oraz odpowiednie dopasowanie całej biblioteki do współpracy z .NET Core. Przeszukując różne fora tematyczne możecie natrafić na kod pisany przez różnych programistów celem obsługi tej biblioteki. Jednakże obecnie jest to niewymagane ponieważ pełna obsługa bibloteki znajduje się w paczce Microsfot.Extenstions.Logging.Log4Net.AspNetCore.
Przejdźmy zatem do utworzenia nowej aplikacji ASP.NET Core MVC. Posiadając gotowy szkielet instalujemy odpowiednią paczkę:
W tym momencie możemy przejść do niezywkle istotnego kroku jakim jest odpowiednia konfiguracja naszego projektu. Dodajemy poniższy wpis w sekcji Configure() naszej aplikacji:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddLog4Net();
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
...
...
...
}
Następny, niezywkle istotny krok to przygotowanie pliku konfiguracyjnego. Wszystkie szczegóły dotyczące tworzenia i panujących reguł możecie znaleźć w pierwszym artykule: .NET Core - Log4net: wprowadzenie
Tworzymy nowy plik pod nazwą log4net.configure a następnie wklejamy poniższy kod (najprostrzy możliwy przykład):
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="C:\Temp\app.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
Możemy teraz uruchomić aplikację i podejrzeć plik app.log znajdujący się w folderze Temp na dysku C:
Możecie zobaczyć szerg informacji dodanych do naszego dziennika zdarzeń. Odtworzyliśmy domyślny mechanizm logowania dostępny w .NET Core z pomocą biblioteki Log4net. Czy te informacje są dla Ciebie istotne? To kwestia odpowiedniej konfiguracji i podejścia do odczytawania danych z dziennika zdarzeń.
Z punktu widzenia programisty oraz operacji przez niego zaimplementowanych, niezwykle ważne są informacje udostępniane z poziomu kodu. W przypadku aplikacji konsolowej nie mieliśmy z tym problemu. Podobnie jest tutaj, wystarczy wykorzystać mechanizmy dostępne w .NET Core, tzn. Dependency Injection. Działanie prześledzimy na podstawie bazowego kontrolera (szczegóły opis jako komenatarze kodu):
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace Log4NetWithAspNetCore.Controllers
{
public class HomeController : Controller
{
// tworzymy prywatny typ wykonujący operacje logowania
private readonly ILogger _logger;
// Konstruktor
// Pobieramy obiekt <ILogger<NazwaKontrolera> przy wykorzystaniu Dependency Injection
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
// Akcja
// Dodajemy do dziennika zdarzeń informację prosto z naszego kodu
public IActionResult Index()
{
_logger.LogDebug("DEBUG: użytkownik przeszedł na ekran główny!");
return View();
}
}
}
Jako wynik uruchomienia aplikacji webowej oraz przejścia do odpowiedniego widoku możemy zobaczyć rozszerzone informacje zawarte w naszym dzienniku zdarzeń:
Oczywiście jest to przykład niezwykle podstawowy. Miał jednak na celu pokazanie podejścia i wykorzystnia mechanizów dostępnych w technologii, które pozwalają nam na przygotowanie (skrojonego na nasze potrzeby) dziennika zdarzeń. Używając takiego podejścia, wszystkie nasze żądania dotyczące dziennika zdarzeń będą przekazywane do implementacji log4net.