log4net vs. Nlog

355

Czy ktoś ma doświadczenie w obu przypadkach? Jak się ze sobą zestawiają?

Planujemy użyć jednego z nich do logowania się w aplikacji korporacyjnej.

Bibliografia:

log4net

nlog

EDYCJA: Nie mamy żadnych zależności od nlog lub log4net.

Greg Dean
źródło
9
To jest logger, którego używam: System.IO.File.AppendAllText (@ "c: \ log.txt", string.Format ("{0} \ r \ n", wiadomość));
zumalifeguard
213
To dobrze dla Ciebie, ale niektóre osoby mogą potrzebować możliwości dynamicznego włączania / wyłączania logowania, korzystania z różnych poziomów dziennika, automatycznego usuwania starych danych dziennika itp.
Tor Hovland,
23
Należy zauważyć, że dokumentacja Log4Net jest okropna.
BentOnCoding
Szczegółowy post na blogu robertmccarter.com/switching-to-nlog
Michael Freidgeim
2
Powinieneś spróbować ReflectInsight. Znacznie silniejszy niż oba insightextensions.codeplex.com
code5

Odpowiedzi:

383

Niedawno otrzymałem zadanie „prototypowania loginu” dla nadchodzącego projektu. Nie miałem żadnego doświadczenia w logowaniu. Przez kilka dni przeglądałem samouczki, tworzyłem aplikacje zabawkowe itp. W Log4Net, NLog i Enterprise Library. Wróć 3-4 tygodnie później i połącz je w spójne demo. Mam nadzieję, że niektóre z nich są dla Ciebie przydatne.

Moja rekomendacja dla naszego projektu jest następująca:

  1. Użyj fasady rejestrowania (np. Common.Logging , SimpleLoggingFacade ), aby uniknąć bezpośrednich zależności.
  2. Jeśli ostatecznie skorzystamy z Biblioteki korporacyjnej do innych obiektów, użyj jej również do rejestrowania.
  3. Jeśli ostatecznie wykorzystamy coś zależnego od Log4Net, użyj Log4Net.
  4. Jeśli nie ma żadnej z powyższych opcji, użyj NLog. Który wolałbym.

Jest to oparte na tych ustaleniach (opiniach!):

  • Wszystkie 3 frameworki są zdolne i potrafią robić pewne zaawansowane rzeczy. Chcemy rozwiązania wysokiej jakości, ale szczerze mówiąc, nie potrzebujemy ultra wysokiej wydajności ani 60 rodzajów odbiorników zdarzeń.
  • Wszystkie 3 mają bardzo podobne podstawowe pojęcia.
  • Każdy ma swoje własne fajne sztuczki, takie jak naprawdę zaawansowany routing lub dynamiczne nazwy plików dziennika, obcinanie plików itp.
  • Wszystkie 3 są dość dobrze udokumentowane na swój własny sposób.
  • Zupełnie nowi jak ja, początkowo wszyscy byli trochę niezręczni. Nie ma tutaj drastycznych różnic dotyczących podstaw. Przeszedłem przez to.
  • Po ponownym przejrzeniu kilku tygodni później NLog był najwyraźniej najłatwiejszy do wznowienia. Potrzebowałem bardzo mało pędzla. Dzięki Log4Net musiałem ponownie zapoznać się z kilkoma przykładami online, aby zacząć. W EntLib zrezygnowałem i samouczki od początku wykonałem od nowa - byłem całkowicie zagubiony.
  • Nie mogłem wymyślić, jak skłonić EntLib do wykonania takich czynności, jak logowanie do bazy danych. To może być łatwe, ale przekroczyło mój limit czasowy.
  • Log4Net i NLog mają mały ślad w kodzie. EntLib jest spamem, ale i tak użyłbym nad nim fasady.
  • Przypadkowo źle skonfigurowałem EntLib i powiedział mi to w czasie wykonywania. Log4Net nie. Nie miałem przypadkowej błędnej konfiguracji z NLog.
  • EntLib zawiera przyjemnie wyglądający edytor app.config, którego potrzebujesz w 100%. NLog ma schemat pliku konfiguracyjnego, więc otrzymujesz „intellisense”. Log4Net ma nada.

Więc oczywiście do tej pory lubię NLog. Jednak nie wystarczy, aby go użyć, mimo że dostępne jest inne rozwiązanie.

Matt
źródło
19
+1 za zalecenie budowy fasady dla prawdziwej separacji obaw (SoC), aby nie zanieczyszczać domeny.
eduncan911
66
Fasada działa tylko wtedy, gdy możesz to zrobić bez przełamywania wartości diagnostycznych zależnych od stosu wywołań itp. Widziałem wiele fasad, które łamią te podstawowe funkcje diagnostyczne, które ostatecznie wyrządziły więcej szkody niż to ...
James Schek
11
Log4Net nie obsługuje jeszcze profili klientów .NET 3.5 SP1 i .NET 4, ponieważ odwołuje się do System.Web. Chciałem tylko to podkreślić, chociaż jest to ściśle związane z „zależnością od Log4Net, użyj Log4Net”.
Simon D.
59
NLog jest aktywnie wspierany ( nlog-project.org/download ), podczas gdy Log4Net nie został zaktualizowany od czasu opublikowania wersji 1.2.10 opublikowanej 19 kwietnia 2006 r. ( Issues.apache.org/jira/browse/LOG4NET/fixforversion/11128 )
Jay Cincotta,
5
Jeśli masz zależność od biblioteki używającej log4net i chcesz zamiast tego użyć NLog (lub odwrotnie), dość łatwo jest napisać i skonfigurować niestandardową klasę Appendera w celu połączenia tych dwóch.
dbkk
158

Kluczowym zagadnieniem, o którym niewiele się dyskutuje, jest wsparcie i aktualizacje.

Log4Net nie został zaktualizowany od czasu opublikowania wersji 1.2.10 19 kwietnia 2006 r .

Natomiast NLog jest aktywnie wspierany od 2006 r. Wkrótce wyda NLog 2.0 obsługujący wiele platform, które nie istniały podczas ostatniej aktualizacji log4net, takie jak:

  • NET Framework 2.0 SP1 i nowszy, 3.5 i 4.0 (klient i profile rozszerzone)
  • Silverlight 2.0, 3.0, 4.0
  • .NET Compact Framework 2.0, 3.5
  • Profil Mono 2.x.
Jay Cincotta
źródło
30
Ale czy wymaga aktualizacji? Jeśli to nie jest zepsute, nie naprawiaj tego?
glenneroo,
24
To jest uszkodzony: Rozdzielczość * bałagan adres ip pomiędzy IPv4 / IPv6 dla localhost na Vista i Win7 (kilka nieoficjalne patche są pływających wokół) * Nie skompilować w .NET 4.0 Client Profile
Tormod Hystad
6
Wygląda na to, że w programie Log4Net działa wersja .NET 4.0.
scope_creep
38
log4net uruchomił wersję 1.2.11 w październiku 2011 r . Myślę, że ta odpowiedź jest już nieaktualna.
Mariano Desanze
83
Właściwie ta odpowiedź wciąż była dla mnie cenna. Jestem w trakcie wybierania rejestratora, a ta odpowiedź mówi nam, że log4net został zaktualizowany raz w ostatniej połowie dekady, podczas gdy NLog jest bardziej aktywnym projektem.
Batibix,
97

Mając ostatnio doświadczenie z obiema platformami, pomyślałem, że mogę podzielić się swoimi poglądami na temat każdej z platform.

Zostałem poproszony o ocenę ram rejestrowania dla istniejącej aplikacji internetowej, zawęziłem swoje możliwości do NLog (v2.0) i log4net (v1.2.11) po przejściu przez różne fora internetowe. Oto moje ustalenia:

  1. Założenie / uruchomienie z NLog jest bardzo łatwe. Przejdziesz samouczek Pierwsze kroki na ich stronie internetowej i gotowe. Masz dobry pomysł, jak może wyglądać nlog. Plik konfiguracji jest tak intuicyjny, że każdy może zrozumieć konfigurację. Na przykład: jeśli chcesz ustawić logowanie wewnętrzne, ustaw flagę w węźle nagłówka pliku konfiguracyjnego Nlog, czyli tam, gdzie się tego spodziewałeś. W log4net ustawiasz różne flagi w sekcji appSettings aplikacji web.config.

  2. W log4net rejestrowanie wewnętrzne nie generuje irytującego znacznika czasu. W Nlogu masz ładny dziennik ze znacznikami czasu. Uznałem, że jest to bardzo przydatne w moich ocenach.

  3. Filtry w log4net - Lepiej sprawdź moje pytanie - filtr log4net - jak pisać ORAZ filtr, aby ignorować komunikaty dziennika, a jeśli znajdziesz na to odpowiedź / rozwiązanie, daj mi znać. Rozumiem, że istnieje możliwość obejścia tego pytania, ponieważ możesz napisać własny filtr niestandardowy. Ale coś, co nie jest łatwo dostępne w log4net.

  4. Wydajność - zalogowałem około 3000 komunikatów dziennika do bazy danych przy użyciu procedury składowanej. Użyłem simple for loop (int i = 0; i <3000; i ++ ... aby zarejestrować tę samą wiadomość 3000 razy. Do zapisu: log4net AdoAppender zabrał prawie dwa razy więcej czasu niż NLog.

  5. Log4net nie obsługuje asynchronicznego programu dołączającego.

Wystarczyło porównanie, aby wybrać NLog jako środowisko rejestrowania. :)

Narayan Akhade
źródło
Wewnętrzne dzienniki debugowania log4net: logging.apache.org/log4net/release/sdk/…
Narayan Akhade
36

Dla każdego, kto spóźni się na ten wątek, warto zajrzeć do biblioteki bazowej .Net Base Class Library (BCL). Wiele osób nie zauważyło zmian między .Net 1.1 a .Net 2.0, kiedy wprowadzono klasę TraceSource (około 2005).

Korzystanie z TraceSource jest podobne do innych platform rejestrowania, z dokładną kontrolą rejestrowania, konfiguracją w app.config / web.config i dostępem programowym - bez narzutu na blok aplikacji korporacyjnych.

Istnieje także szereg porównań: „log4net vs TraceSource”

Jeremy
źródło
1
EntLib rozszerza TraceSource
Michael Freidgeim
34

Dla nas kluczową różnicą jest ogólna perf ...

Spójrz na Logger.IsDebugEnabledNLog kontra Log4Net, z naszych testów NLog ma mniejszy narzut i właśnie o to nam chodzi (rzeczy o niskim opóźnieniu).

Na zdrowie, Florian

Florian Doyon
źródło
25

Najpierw spójrz na resztę swojego stosu.

Jeśli korzystasz z NHibernate, korzysta on bezpośrednio z Log4Net. Inne platformy mogą mieć inne specyficzne programy rejestrujące, których potrzebują.

Poza tym: oba działają dobrze.

Sam zdecydowałem się na Log4Net. Konfiguracja może być uciążliwa, a jeśli nie jest poprawnie skonfigurowana, trudno jest dowiedzieć się, co poszło nie tak. Ale możesz zmusić go do robienia wszystkiego, co chcesz od rejestratora.

Jeśli nie masz stałego problemu z Log4Net, oto artykuł, który napisałem o tym, jak zacząć: http://elegantcode.com/2007/12/07/getting-started-with-log4net/

Chris Brandsma
źródło
9
@greg: Zauważ, że w NHibernate v3 zależność od log4net jest na szczęście usunięta - można ją podłączyć, więc możesz użyć NLog, jeśli chcesz.
UpTheCreek
NLog jest równie trudny do skonfigurowania / ustalenia, co jest nie tak. Przynajmniej z log4net możesz znaleźć dokumentację i / lub google dla problemów.
Mrchief
Warto wziąć pod uwagę resztę swojego stosu, nie mogę powiedzieć, że to problem, który wziąłbym pod uwagę. Chociaż wygląda na to, że NHibernate nie jest już przykładem dla tego scenariusza, Sitecore stanowi współczesny przykład tego, ponieważ używa Log4Net wewnętrznie. Sitecore jest dość rozszerzalny, więc możesz użyć tego, co wolisz zalogować, ale jest to o wiele bardziej skomplikowane niż edytowanie pliku web.config witryny w celu dodania własnych rejestratorów
Scott Simontis
14

Powtarzam powyższe i wolę nLog. Entlib jest niepotrzebnie wzdęty.

Re: Log4net Jedną z rzeczy, którą ZAWSZE mnie loguje do log4net, jest zapomnienie o dodaniu następujących elementów do pliku global.asax w celu zainicjowania komponentu:

log4net.Config.XmlConfigurator.Configure();
Francis Shanahan
źródło
13

Jeśli pójdziesz tutaj , znajdziesz kompleksową matrycę, która obejmuje zarówno biblioteki NLog i Log4Net, jak i Enterprise Lib i inne produkty.

Ktoś mógłby argumentować, że matryca jest wykonana w sposób podkreślający cechy jedynej komercyjnej biblioteki lib znajdującej się w matrycy. Myślę, że to prawda, ale i tak przydał się mój wybór w porównaniu do NLog.

pozdrowienia

Lorenzo
źródło
1
Patrząc na tę matrycę, wydaje się ona znacznie nieaktualna, przynajmniej w odniesieniu do frameworka The Object Guy, który jest konkurentem komercyjnym.
Andy Dent,
9

Jak zauważyłem, log4net blokuje pliki wyjściowe przez cały czas działania aplikacji, więc nie można ich usunąć. W przeciwnym razie są podobne.

Więc wolę NLog.

Vitaliy Ulantikov
źródło
22
Dodaj <lockModel type = "log4net.Appender.FileAppender + MinimalLock" /> do konfiguracji fileappender, aby temu zapobiec (wspomniane na stronie przykładów log4net tutaj: logging.apache.org/log4net/release/config-examples.html )
EventHorizon
9

Bezwstydna wtyczka do projektu typu open source, który prowadzę, ale biorąc pod uwagę ożywioną dyskusję na temat tego, które ramy rejestrowania .NET są bardziej aktywne, pomyślałem, że opublikuję obowiązkowy link do Serilog .

Aby korzystać z aplikacji, Serilog jest podobny do log4net (i czerpie z niego dużo). Jednak w przeciwieństwie do innych opcji rejestrowania .NET, Serilog polega na zachowaniu struktury zdarzeń dziennika do analizy offline. Kiedy piszesz:

Log.Information("The answer is {Answer}", 42);

Większość bibliotek rejestrujących natychmiast renderuje komunikat w ciąg. Serilog też może to zrobić, ale zachowuje tę { Answer: 42 }właściwość, aby później, korzystając z jednego z wielu magazynów danych NoSQL, można poprawnie wyszukiwać zdarzenia na podstawie wartości Answer.

Jesteśmy blisko wersji 1.0 i obsługujemy wszystkie nowoczesne platformy (.NET 4.5, Windows Store i Windows Phone 8).

Nicholas Blumhardt
źródło
Ale pytanie brzmi: czy obsługuje Mono? ;) Wygląda obiecująco (i uwielbiam logo nici i igły), ale nie mogłem znaleźć żadnych informacji na temat tego, czy obsługuje Mono, czy nie.
ashokgelal
Dobre pytanie :) ... tak, mamy użytkowników na Mono - nie jestem pewien, czy używają kompilacji Serilog .NET 4.5 lub 4.0, ale jeśli napotkasz jakieś problemy, pomożemy.
Nicholas Blumhardt
Wsparcie .NET 4.5 mnie, pobieranie i wypróbowanie rozwiązania teraz
Fat Shogun
8

Drugi też NLog, ponieważ działa również z niezarządzanym kodem. Podejrzewam, że można używać log4net i log4cxx razem, ale NLog obsługuje zarówno kod zarządzany, jak i niezarządzany po wyjęciu z pudełka.

Spojrzałem również na Common.Logging , fasadę, która tworzy abstrakcję interfejsu logowania, obsługuje log4net, NLog i bibliotekę Entreprise. Nie sądzę, że będę go używał, ale podoba mi się, jak używają lambdas do poprawy wydajności, gdy logowanie jest wyłączone (funkcja współdzielona z NLog i prawdopodobnie innymi).

eddycharly
źródło
4

Możesz również rozważyć blok rejestrowania biblioteki Microsoft Enterprise Library . Pochodzi z miłym projektantem.

Rashack
źródło
3
Umożliwia konfigurację wizualną w przeciwieństwie do ręcznego tworzenia XML. Zależy od twojego gustu ...
Rashack
13
Pomysł użycia do tego celu narzędzi wizualnych nie jest dobry.
Adam Dymitruk
4
Może nie jest to dobra rzecz, ale dla EntLib wymagany jest konfigurator wizualny. Ręczne pisanie konfiguracji jest praktycznie niemożliwe, jest zbyt skomplikowane (wiesz, że pochodzi od Microsoft).
Pavel Hodek,
1
Nawet jeśli ktoś nie lubił wizualnego projektanta, dlaczego głosować za nim! : o
nawfal
EntLib rejestruje się synchronicznie, może zasadniczo obniżyć wydajność.
Michael Freidgeim,
2

Myślę, że ogólny konsensus jest taki, że nlog jest nieco łatwiejszy do skonfigurowania i używania. Oba są jednak całkiem zdolne.

Tsimon
źródło
0

Na podstawie mojego doświadczenia, SmartInspect pokonuje zarówno jak i log4net.

Jest niezwykle łatwy w użyciu, dokumentacja jest świetna, a Ty możesz przeglądać i filtrować wcześniej zarejestrowane wiadomości pomocą interaktywnej przeglądarki dziennika , co stanowi ogromną zaletę w świecie rzeczywistym.

Jedną z rzeczy, które lubię, są widoki danych na kartach, takie jak karty przeglądarki w Chrome. Każda karta może zapewniać inny filtrowany widok dziennika.

Contango
źródło
11
To jest płatny produkt. NLog i Log4Net są bezpłatne.
Zo ma