Łukasz Gąsior
  • Home
  • now!
  • Blog
  • Po polsku
Social Links
Twitter
LinkedIn
Facebook
YouTube
Reddit
Instagram
GitHub
Medium
RSS
Łukasz Gąsior
  • Home
  • now!
  • Blog
  • Po polsku
  • Po polsku

log4net – logujemy zdarzenia w aplikacji

  • 2009-12-07
  • 5 komentarzy
  • 3 minute read
  • 458 views

Dzisiaj chciałbym poruszyć ważny element tworzenia aplikacji – logowanie zdarzeń. Odpowiednio przygotowane logi są często jedynym sposobem na zdiagnozowanie problemu w aplikacji, dlatego warto o tym pamiętać i z logowania korzystać.
Logowanie można przeprowadzić na wiele sposobów – ja chciałbym opisać przykład oparty na darmowej bibliotece log4net.
Temat ten podzieliłem na trzy części:

  • dzisiaj pokażę jak korzystać z log4net
  • w następnym poście pokażę, jak czytać/analizować logi
  • na koniec opiszę podstawową konfigurację log4net

To zaczynamy:
bibliotekę pobieramy ze strony: http://logging.apache.org/log4net/download.html. Z pobranego archiwum wypakowujemy plik: log4net.dll (incubating-log4net-1.2.10.ziplog4net-1.2.10binnet2.0releaselog4net.dll) i wgrywamy go np. do katalogu “lib“. Następnie dodajemy referencję do tego pliku.
log4net1
W swoich aplikacjach korzystam z takiej klasy:
[sourcecode language=”csharp”] public class LogHelper
{
static LogHelper()
{
var confFile = ConfigurationSettings.AppSettings.Get("log4net.config");
var fi = new FileInfo(confFile);
XmlConfigurator.Configure(fi);
}
public static ILog GetLog()
{
return LogManager.GetLogger("WebAppLog");
}
}
[/sourcecode] Jak widać w pliku Web.config podajemy ścieżkę do pliku konfiguracyjnego, czyli:
[sourcecode language=”xml”] <appSettings>
<add key="log4net.config" value="conflog4net.config"/>
</appSettings>
[/sourcecode] Brakuje jeszcze zawartości pliku log4net.config:
[sourcecode language=”xml”] <log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<file value="logstest_log.log" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<param name="StaticLogFileName" value="true"/>
<appendToFile value="true" />
<param name="RollingStyle" value="Date"/>
<param name="DatePattern" value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %type.%method – %message%newline"/>
</layout>
</appender>
<logger name="WebAppLog">
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</logger>
</log4net>
[/sourcecode] Podana konfiguracja zapisuje logi do pliku (może to być również baza danych, e-mail, konsola lub inne źródło) – file określa, do jakiego pliku będą zapisywane logi, a layout określa format zapisu logów.
Samo logowanie jest operacją niezwykle prostą:
[sourcecode language=”csharp”] LogHelper.GetLog().Info("My sample comments");
[/sourcecode] lub
[sourcecode language=”csharp”] catch (Exception ex)
{
LogHelper.GetLog().Error("Error occurred!", ex);
}
[/sourcecode] log4net dostarcza kilka poziomów logowania:

  • Debug
  • Info
  • Warn
  • Error
  • Fatal

Nazwy poziomów logowania są bardzo czytelne i nie wymagają większego opisu.
Powyższy kod w logu zapisać może coś takiego:
[sourcecode language=”text”] 2009-12-07 22:22:33,202 [8] INFO  LogForNetWebSample._Default.Page_Load – My sample comments
2009-12-07 22:22:33,292 [8] ERROR LogForNetWebSample._Default.Page_Load – Error occurred!
System.DivideByZeroException: Attempted to divide by zero.
at LogForNetWebSample._Default.Page_Load(Object sender, EventArgs e) in Default.aspx.cs:line 14
[/sourcecode] Jak widać log zawiera wiele cennych dla nas informacji – wiemy, kiedy i co się zdarzyło oraz w jakiej metodzie. Wiemy również, co działo się w aplikacji zanim wystąpił wyjątek.
Osobiście jestem zwolennikiem logowania jak największej ilości zdarzeń w naszej aplikacji – użytkownik wchodzi na stronę, klika button A, pobrano dane użytkownika, itp – jako poziom Debug. Przy przenoszeniu aplikacji na serwer produkcyjny możemy ograniczyć poziom logowania i logować jedynie logi z poziomu Error, Fatal czy Warn – bez zmiany kodu aplikacji!
log4net jest biblioteką bardzo elastyczną i posiada wiele parametrów konfiguracyjnych.
Oczywiście podczas logowania trzeba uważać, żeby nie zalogować danych poufnych – np. haseł.
Dzisiaj to tyle – zachęcam do zabawy z log4net i czytaniem logów – tylko uwaga – TO UZALEŻNIA!! 🙂

Share
Tweet
Share
Share
Related Topics
  • log4net
  • logowanie
You May Also Like
View Post
  • Po polsku

Software Craftsmanship Wrocław

  • 2017-06-06
View Post
  • Po polsku

Pilnuj typów danych

  • 2014-02-26
View Post
  • Po polsku

ReSharper Essentials – poszło!

  • 2014-02-21
View Post
  • Po polsku

Turbo-Mode Developera

  • 2014-02-19
View Post
  • Po polsku

Badanie usability by TechSmith

  • 2014-02-13
View Post
  • Po polsku

Global Windows Azure Bootcamp 2014

  • 2014-02-05
View Post
  • Po polsku

Quick tip: 12. Stosuj AsNoTracking() gdzie się da!

  • 2013-01-27
View Post
  • Po polsku

Quick tip: 11. Indexed views vs. SQL Server Express

  • 2012-07-23
5 comments
  1. Procent pisze:
    2009-12-08 o 10:24

    Polecam tworzenie statycznego loggera w każdej klasie osobno: static ILog _log = LogManager.GetLogger(typeof(CurrentClass)). Takie podejście stworzy całą hierarchię loggerów (wg przestrzeni nazw). Hierarcha owa ma przeolbrzymią zaletę: pozwala konfigurowac każdy logger z osobna W RUNTIME. Umiejętne operowanie plikiem konfiguracyjnym pozwoli wówczas wypisac w odpowiednie miejsce odfiltrowane, żądana informacje w formacie jaki nam odpowiada, bez zatrzymywania aplikacji! Na przykład badając zachowanie jakiejś klasy można włączyc poziom debug dla niej jednej, wyłączając wszystko inne – i mamy doskonaly wgląd w to co sie dzieje w tej jednej części systemu. Super sprawa. Tylko inicjalizując log4net zamiast .Configure() trzeba wywolac metode ConfigureAndWatch().

  2. Pingback: dotnetomaniak.pl
  3. mb pisze:
    2009-12-08 o 22:17

    Pokażę pisze się przez “ż” – 2 razy w tekście jest przez “rz”. Popraw, proszę, ponieważ tekst bardzo fajny i szkoda go psuć błędami ortograficznymi 🙂

  4. Łukasz Gąsior pisze:
    2009-12-08 o 22:53

    @mb – dzięki – jakoś się wkradło podstępnie 😉
    @Procent – jest to jedna z ciekawych/możliwych propozycji.
    Ja wolę tworzyć kilka Logerów w zależności od “modułu” aplikacji, np.:
    LogHelper.Dahsboard(), LogHelper.Payments(), LogHelper.Scheduler(), itp. Każdy z osobnymi ustawieniami – również logowane do osobnych plików.
    Chcąc analizować zachowanie jednej klasy można bardzo łatwo filtrować zawartość loga.
    Kwestia potrzeb i przyzwyczajenia 🙂

  5. bin pisze:
    2011-05-01 o 15:39

    jest fajny nowy stuff jak log4net ale ciagle rozwijany i to robiony chyba przez Polaków. Sprawdzcie http://nlog.codeplex.com/

Comments are closed.

click & help!
Nakarm dziecko!
Follow me
RESHARPER ESSENTIALS
ReSharper Essentials
CODINGTV();
codingtv();
Twitter Feed
Categories
  • Azure Cloud (6)
  • Po polsku (104)
  • Windows (1)
Featured Posts
  • Azure Activity Log – Change History
    • 2020-09-29
  • Diagram Driven Cloud Infrastructure with Cloud Maker
    • 2020-09-22
  • Azure ARM template, but it is not JSON!
    • 2020-09-15
About
👍 Cloud | DevOps | Development | Technical Leadership | 📗Author of "ReSharper Essentials
© 2019 Łukasz Gąsior. All rights reserved.
hosted with ♥️ on webio | Polityka prywatności

Input your search keywords and press Enter.