log4net対Nlog


355

誰もが両方の経験がありますか?彼らはどのように互いに積み重ねますか?

そのうちの1つをエンタープライズアプリケーションのログインに使用することを計画しています。

参照:

log4net

nlog

編集:nlogまたはlog4netへの既存の依存関係はありません。


9
これは私が使用するロガーです:System.IO.File.AppendAllText(@ "c:\ log.txt"、string.Format( "{0} \ r \ n"、message));
zumalifeguard 2010

213
あなたのために良いが、一部の人々は、自動的など、古いログデータ、削除するために、さまざまなログレベルを使用するために、動的にオン/オフのログを有効にする機能が必要な場合があり
Torのホプランドの

23
Log4Netのドキュメントはひどいことに注意してください。
BentOnCoding 2012年

詳細なブログ投稿がありますrobertmccarter.com/switching-to-nlog
Michael Freidgeim 2013

2
ReflectInsightを試してみてください。はるかに強力な、両方のinsightextensions.codeplex.com
CODE5

回答:


383

私は最近、次のプロジェクトのために「いくつかのロギンをプロトタイプ化する」ように命じられました。ロギングフレームワークの経験はありませんでした。数日間、Log4Net、NLog、Enterprise Libraryで調査し、チュートリアルを実行し、おもちゃのアプリなどを作成しました。3〜4週間後に戻ってきて、まとまりのあるデモにまとめます。うまくいけば、これのいくつかはあなたにとって有用です。

私たちのプロジェクトに対する私の推奨はこれです:

  1. 直接的な依存関係を回避するには、ロギングファサード(Common.LoggingSimpleLoggingFacadeなど)を使用します。
  2. エンタープライズライブラリを他の機能に使用することになった場合は、それをロギングにも使用します。
  3. 最終的にLog4Netに依存するものを使用する場合は、Log4Netを使用します。
  4. 上記のいずれでもない場合は、NLogを使用します。どちらがいいですか。

それはこれらの調査結果に基づいています(意見!):

  • 3つのフレームワークはすべて機能し、いくつかの高度な機能を実行できます。私たちは高品質のソリューションを求めていますが、率直に言って、超高性能や60種類のイベントシンクは必要ありません。
  • 3つすべてに非常に類似した基本概念があります。
  • それぞれには、本当に高度なルーティング、動的ログファイル名、ファイルの切り捨てなど、独自のクールなトリックがあります。
  • 3つすべては、独自の方法でかなり文書化されています。
  • 私のような完全な初心者のために、それらはすべて最初は少し厄介でした。基本については、ここで大きな違いはありません。私はそれを乗り越えました。
  • 数週間後に物事を再検討したとき、NLogは再開するのが明らかに最も簡単でした。私はそれをほんの少しブラシアップする必要がありました。Log4Netを使用するためには、オンラインの例をいくつか再検討する必要がありました。EntLibを使用して、あきらめ、チュートリアルを最初からやり直しました-完全に迷っていました。
  • EntLibにデータベースへのログ記録などを実行させる方法を理解できませんでした。簡単かもしれませんが、私の時間制限を超えていました。
  • Log4NetとNLogはコード内のフットプリントが小さい。EntLibはスパム行為がありますが、とにかくファサードを使用します。
  • 私が誤ってEntLibを誤って構成し、実行時にそれを教えてくれました。Log4Netはそうしませんでした。NLogを誤って設定することはありませんでした。
  • EntLibには、100%必要な見栄えの良いapp.configエディターが付属しています。NLogには構成ファイルスキーマがあるため、「intellisense」を取得できます。Log4Netにはnadaが付属しています。

明らかに私は今のところNLogが好きです。ただし、別の解決策があるにもかかわらず、それを使用するには不十分です。


19
真の関心の分離(SoC)のためにファサードを構築することを推奨することで+1、またはそうすることで、ドメインを汚染しません。
eduncan911 2010年

66
ファサードは、コールスタックなどに依存する診断値を壊すことなく実行できる場合にのみ機能します。これらの重要な診断機能を壊すファサードが多数あり、その結果、害がさらに大きくなりました...
Jamesシェク

11
Log4NetはSystem.Webを参照するため、.NET 3.5 SP1および.NET 4のクライアントプロファイルはまだサポートされていません。それを指摘したかっただけですが、それは実際には「Log4Netへの依存性があるため、Log4Netを使用する」と密接に関連しています。
Simon D.

59
NLogは、積極的に(サポートされているnlog-project.org/downloadバージョン1.2.10は、2006年4月19日(公開発表された以降に更新されていないlog4netの間)issues.apache.org/jira/browse/LOG4NET/fixforversion/11128を
ジェイシンコッタ

5
log4netを使用するライブラリに依存していて、代わりにNLogを使用したい場合(またはその逆)、2つをブリッジするカスタムAppenderクラスを作成して構成するのはかなり簡単です。
dbkk

158

あまり議論されていない重要な考慮事項は、サポートとアップデートです。

Log4Netは、バージョン1.2.10が2006年4月19日に公開されてから更新されていません

対照的に、NLogは2006年以降積極的にサポートされており、log4netが最後に更新されたときに存在しなかった次のような多くのプラットフォームをサポートするNLog 2.0がまもなくリリースれます。

  • NET Framework 2.0 SP1以上、3.5および4.0(クライアントおよび拡張プロファイル)
  • Silverlight 2.0、3.0、4.0
  • .NET Compact Framework 2.0、3.5
  • Mono 2.xプロファイル

30
しかし、更新する必要がありますか?壊れていない場合は修正しないでください。
glenneroo 2010年

24
それ壊れています:* VistaとWin7のlocalhostのIPv4 / IPv6間のIPアドレス解決を
メッセ化し

6
Log4Netの動作には.NET 4.0バージョンがあるようです。
scope_creep

38
log4netは、2011年10月にv1.2.11をリリースしました。この答えはもう時代遅れだと思います。
マリアーノデサンツェ

83
実際、この答えは私にとってまだ貴重でした。私はロガーを選択している最中です。この回答は、log4netが過去50年間に1回更新されている一方で、NLogはよりアクティブなプロジェクトであることを示しています。
Batibix

97

最近、両方のフレームワークでの経験があるので、各フレームワークについての見解を共有できると思いました。

既存のWebアプリケーションのロギングフレームワークを評価するように依頼され、さまざまなオンラインフォーラムを通過した後、NLog(v2.0)とlog4net(v1.2.11)に選択肢を絞り込みました。これが私の発見です:

  1. NLogを使用した設定/起動は非常に簡単です。あなたは彼らのウェブサイトで入門チュートリアルを通り抜け、あなたは完了です。あなたは公平な考えを得ます、それはnlogでどのようになるかです。設定ファイルは非常に直感的で、誰でも設定を理解できます。例:内部ログをオンに設定する場合は、Nlog構成ファイルのヘッダーノードにフラグを設定します。これは、その場所であると予想される場所です。log4netでは、web.configのappSettingsセクションでさまざまなフラグを設定します。

  2. log4netでは、内部ログはタイムスタンプを出力しません。Nlogでは、タイムスタンプ付きの素晴らしいログを取得します。私の評価ではそれがとても役に立ったと思います。

  3. log4netのフィルター-この質問をよく確認してください-log4netフィルター-ログメッセージを無視するように記述してフィルター処理する方法。このための回答/解決策を見つけた場合は、お知らせください。独自のカスタムフィルターを作成できるため、この質問には回避策があります。しかし、log4netで簡単に利用できないもの。

  4. パフォーマンス-ストアドプロシージャを使用して、約3000のログメッセージをデータベースに記録しました。単純なforループ(int i = 0; i <3000; i ++ ...を使用して、同じメッセージを3000回記録しました。書き込みの場合:log4net AdoAppenderは、NLogのほぼ2倍の時間を要しました。

  5. Log4netは非同期アペンダーをサポートしていません。

ロギングフレームワークとしてNLogを選択することは、私にとって十分な比較でした。:)


log4netのの内部デバッグログ:logging.apache.org/log4net/release/sdk/...
ナラヤンAkhade

36

このスレッドに遅れて到着した方は、.Net Base Class Library(BCL)をもう一度確認してください。TraceSourceクラスが導入されたとき(2005年頃)、多くの人々は.Net 1.1と.Net 2.0の間の変更を見逃していました。

TraceSourceの使用は他のロギングフレームワークと同様であり、ロギングのきめ細かい制御、app.config / web.configでの構成、プログラムによるアクセスが可能で、エンタープライズアプリケーションブロックのオーバーヘッドがありません。

「log4netとTraceSource」のように、さまざまな比較が浮かんでいます。


1
EntLibはTraceSourceを拡張しています
Michael Freidgeim

34

私たちにとって、主な違いは全体的なパフォーマンスにあります...

見てLogger.IsDebugEnabled我々のテストから、log4netの対NLogで、NLogは少ないオーバーヘッドがあると、それは我々が(低遅延のもの)の後にあるものです。

乾杯、フロリアン


25

まず、残りのスタックを確認します。

NHibernateを使用している場合は、Log4Netを直接利用します。他のフレームワークには、必要な他の特定のロガーがある場合があります。

それ以外はどちらも正常に動作します。

自分でLog4Netを選択しました。設定が面倒な場合があります。正しく設定されていない場合、何が問題だったかを理解するのは面倒です。しかし、ロガーに必要なほとんどすべてのことを実行させることができます。

Log4Netに未解決の問題がない場合は、Log4Netの開始方法について私が書いた記事を以下に示します。http://elegantcode.com/2007/12/07/getting-started-with-log4net/


9
@greg:NHibernate v3では、log4netへの依存関係がありがたいことに削除されていることに注意してください。プラグイン可能なため、必要に応じてNLogを使用できます。
UpTheCreek

NLogも、何が悪いのかを構成/特定するのと同じくらい簡単です。少なくともlog4netを使用すると、ドキュメントや問題のグーグルを見つけることができます。
Mrchief 2013年

スタックの残りの部分を考慮に入れるのは良い点ですが、頭から離れて考えていたのではないかと思います。NHibernateはこのシナリオの例ではなくなったように見えますが、SitecoreはLog4Netを内部で使用しているため、これの現代的な例を提供しています。Sitecoreはかなり拡張可能であるため、ログに記録したいものを何でも使用できますが、サイトのweb.configを編集して独自のロガーを追加するよりもはるかに複雑です
Scott Simontis


14

上記をエコーし​​、nLogを優先します。Entlibは不必要に肥大化しています。

Re:Log4net log4netで常に私に得られることの1つは、コンポーネントを初期化するためにglobal.asaxに以下を追加するのを忘れていることです。

log4net.Config.XmlConfigurator.Configure();

13

ここに行くと、NLogとLog4Netの両方のライブラリ、およびEnterprise Libと他の製品を含む包括的なマトリックスを見つけることができます。

マトリックスは、マトリックスに存在する唯一の商用ライブラリの機能を強調する方法で作成されていると主張する人もいるでしょう。それは本当だと思いますが、とにかく私の選択をNLogと比較するのに役立ちました。

よろしく


1
そのマトリックスを見ると、少なくとも競合他社のObject Guyのフレームワークに関してはかなり古くなっているように見えます。
Andy Dent

9

気づいたように、log4netはアプリケーションの実行中ずっと出力ファイルをロックするため、削除することはできません。それ以外は似ています。

だから私はNLogを好む。


22
<lockingModel type = "log4net.Appender.FileAppender + MinimalLock" />をfileappender構成に追加して、これを防止します(log4netの例のページ:logging.apache.org/log4net/release/config-examples.htmlに記載されています)
EventHorizo​​n

9

私が実行しているオープンソースプロジェクトの恥知らずなプラグインですが、どの.NETロギングフレームワークがよりアクティブであるかについて活発な議論がなされたので、私はSerilogへの必須リンクを投稿すると思いました

アプリケーション内で使用するために、Serilogはlog4netに似ています(そして、それを多用しています)。ただし、他の.NETログオプションとは異なり、Serilogはオフライン分析のためにログイベントの構造を保持することを目的としています。あなたが書くとき:

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

ほとんどのロギングライブラリは、メッセージをすぐに文字列にレンダリングします。Serilogもそれを行うことができますが、{ Answer: 42 }プロパティを保持するため、後でいくつかのNoSQLデータストアの1つを使用して、の値に基づいてイベントを適切にクエリできますAnswer

私たちは1.0に近づいており、すべての最新(.NET 4.5、Windowsストア、Windows Phone 8)プラットフォームをサポートしています。


しかし問題は、Monoをサポートしていますか?;)それは有望に見えます(そして私は糸と針のロゴが大好きです)が、それがMonoをサポートしているかどうかについての情報は見つかりませんでした。
ashokgelal 14

良い質問:) ...はい、Monoのユーザーがいます。Serilogの.NET 4.5または4.0ビルドを使用しているかどうかはわかりませんが、問題が発生した場合はお手伝いします。
Nicholas Blumhardt 2014年

.NET 4.5のサポートにより、今すぐソリューションをダウンロードして試してみました
Fat Shogun

8

アンマネージコードでも動作するので、NLogも2番目に使用しています。log4netとlog4cxxを一緒に使用することも考えられますが、NLogはそのままの状態でマネージコードとアンマネージコードの両方を処理します。

ロギングAPIを抽象化するファサードであるCommon.Loggingも調べました。これは、log4net、NLog、およびEntreprise Libraryをサポートしています。私はそれを使用するつもりはありませんが、ログが無効になっているときにパフォーマンスを改善するためにラムダをどのように使用するかが好きです(NLogやおそらく他の機能と共有されている機能)。


4

Microsoft Enterprise Library Logging Blockも検討してください。素敵なデザイナーが付いています。


3
XMLを手動で作成するのではなく、視覚的に構成することができます。好みに応じて...
Rashack

13
そのようなことに視覚的なツールを使用するという考えは良いことではありません。
Adam Dymitruk、2010年

4
多分良いことではないかもしれませんが、EntLibにはビジュアルコンフィギュレーターが必要です。構成を手動で作成することは事実上不可能であり、非常に複雑です(ご存知のとおり、Microsoftによるものです)。
Pavel Hodek

1
ビジュアルデザイナーが気に入らなかったとしても、なぜ反対票を投じるのでしょうか。:o
nawfal 2013

EntLibは同期的にロギングを行うため、本質的にパフォーマンスに影響を与える可能性があります。
Michael Freidgeim 2013

2

一般的なコンセンサスは、nlogの方が設定と使用が少し簡単だということです。ただし、どちらもかなり能力があります。


0

私の経験に基づくと、SmartInspectはNLogとlog4netの両方に勝っています。

非常に使いやすく、ドキュメントが充実しており、インタラクティブなログビューアを使用して以前にログに記録されたメッセージ表示およびフィルタリングできます。これは、現実に大きな利点です。

私が気に入っている点の1つは、Chromeのブラウザータブのようなデータのタブ付きビューです。各タブは、ログの異なるフィルタービューを提供できます。


11
有料商品です。NLogとLog4Netは無料です。
Zoは2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.