Paweł Łukasiewicz
2019-02-01
Paweł Łukasiewicz
2019-02-01
Udostępnij Udostępnij Kontakt
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ę: Log4net: NuGet Package Manager

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: Log4net: AppLogFile 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ń: Log4net: Rozszerzony dziennik 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.