2011-01-23 9 views
36

標準トレース、Logger.NET、Enterprise Library、log4netまたはUkadc.Diagnosticsのどちらを選択するのですか?トレースとLogger.NET、Enterprise Library、log4net、Ukadc.Diagnosticsのどちらを使うべきですか?

一方が他方よりも適切な状況がありますか? ...それは何だろう? (ASP.NET、コンソールアプリ、Azure Cloud、SOHO、Enterprise ...)

利点と欠点は何ですか?

他の主要なロギングフレームワークがありませんでしたか?

答えて

89

多くの類似の質問は、SOにここにあります

よく使用されるいくつかのロギングフレームワークがありませんでした。

ロギング抽象化を:ここでは一般的に使用されるフレームワークのリストは、あなたが記載されているそのうちのいくつかは、ある

システム。診断アドオン:

その他

彼言及した私が見たことのCodePlexから他のロギングフレームワークのカップル( )SOの再:

なぜあなたは他の上で1つを選ぶのでしょうか?それは厳しいものです。それの多くは個人的な好みです。その中には、技術的(または機能的)な優位性のものがあります。

ロギングフレームワーク(特に第三者のフレームワーク)の明らかな欠点の1つは、サポートの質です。 log4net、NLog、Common.Loggingなどの問題がある場合はどうなりますか?それらのフレームワークの開発者から修正を受けることができますか?これらのフレームワークでソースコードが利用できるので、これは非常に重要ではないかもしれません。しかし、ソースツリーを "継承"するのではなく、修正を加えたり、機能強化を追加したりすることをお勧めします。私は、フレームワークが拡張性があり、通常の拡張ポイントを介して多くの拡張機能を追加できると言っています。

上記のリンクを読めば、好意的な言説だけに基づいて、log4netが明確な「勝者」になると言えると思います。これは歴史的なロギングのお気に入りとして、また多くの人々が今後どのように使用するかについて頻繁に言及されます。

NLogは支持者を持っていますが、log4netは非常によく似ていますが、普及率が高いとは言えません。 NLogの機能はlog4netと非常によく似ており、最近、重要な開発サイクルを経てきたという追加の利点があります。

エンタープライズライブラリは、多くの場合、良い選択肢として宣伝されていますが、多くの場合、ひどい選択肢として宣伝されています。おそらく、そのネガティブな評判の一部は、あまり良い初期のバージョンではないでしょうか?多分それは今より良いですか?

System.Diagnosticsは、多くの場合、少なくとも3つの利点があります。サードパーティの依存性はなく、多くのMicrosoftコンポーネントにSystem.Diagnosticsが装備されています。これは簡単に拡張可能です(おそらく、 log4netやNLogのようなフレームワークでは "無料で"?) System.Diagnosticsを使用している場合は、Trace.WriteLine/Debug.WriteLineではなくTraceSourceオブジェクトを使用することがコンセンサスになると思います。

System.DiagnosticsとWCFがうまく機能することにも注意してください。 WCFメッセージトラフィックはSystem.Diagnosticsで記録することができ、WCFはWCFサービス境界呼び出し全体でSystem.Diagnosticsアクティビティ情報(System.Diagnostics.CorrelationManager.ActivityId)も伝播します。

私は、log4netが最も好意的な状態を維持し続けるべきであるとは確信していません。 As has been noted elsewhere here on SO, log4net does not seem to be undergoing a lot of development recently(2011年7月17日のNLog 2.0 was released)2011年第1四半期に予定されている最終リリースでNLog 2.0がベータ版でリリースされている間、「log4netが死んでいる」と思われます。これによりNLogはlog4netより明らかに優れた選択肢になりますか?私は知らないが、少なくともLog4netの開発がより多くの人生の兆候を示すまで、NLogは少なくとも2つの間で選択する際には少なくとも同等の配慮を受け、おそらく新しい開発のために推薦されるお気に入りであるべきだと思う。

log4netのとNLogは両方とも非常に柔軟な設定オプションを提供します。これらは、ロギングステートメントの定義(タイプごとにロガーを定義する「標準的な」パターン)によって、きめ細かな粒度を持つことができます。また、独自の「ロギング先」オブジェクト(log4net AppendersとNLogターゲット)と「フォーマット」オブジェクト(log4netパターンコンバータとNLog LayoutRenderers)を開発できるようにすることで、ライブラリを簡単に拡張できます。別にロギングフレームワークの選択、抽象化レイヤーを使用することにより、特定のロギングフレームワークに強い依存関係からアプリケーションコードを絶縁するためのいくつかの(多く?)の提唱者から

。これは、おそらく既存のフレームワークの上に実装する独自のILoggerインターフェースの形を取ることができます。将来、ILoggerを別のフレームワークで実装することで、フレームワークを変更することができます。または、DI/IoCを使用してコードに "ILogger"を注入することもできます。多くのDI/IoCフレームワークには、log4net、NLog、またはEnterprise Libraryを使用するように設定できるILogger抽象化機能が組み込まれています。また、独自のILogger実装を記述して注入することもできます。実装は何を気にしていますか?特定のロギングフレームワークに強く依存することからコードを保護する別の方法は、Common.LoggingやSLFなどの既存のロギング抽象化フレームワークの使用です。利点は、アプリケーションが特定のログフレームワークに依存していないことです。しかし、あるものは、別の(ロギング抽象化フレームワークの)依存関係(ロギングフレームワーク上での)の1つだけを交換したという人もいます。ログの抽象化について

つ以上のノート:

  1. 良いログの抽象化を使用すると、同じ出力ファイルに異なるログフレームワークからの出力をキャプチャできるようにする必要があります。 Common.Loggingはこれを "ブリッジング"と呼びます。あなたがNLogに裏打ちされたCommon.Loggingを使ってアプリを書いたとします。ここで、log4netを使って直接書かれたサードパーティのクラスライブラリを使用しているとします。ブリッジシステムでは、log4netの出力を(カスタムアペンダを介して)キャプチャし、Common.Loggingを介して再ルーティングして、サードパーティのクラスライブラリのログ出力をアプリケーションのログ出力のコンテキストで表示できるようにします。ログの抽象化を使用して

  2. はまた、あなたが開発中のフレームワークをログに記録する「テストドライブ」することができます。あなたはlog4netがそのような方法だと思うかもしれませんが、あなたはNLogを試してみることを望んでいます。ロギング抽象化を使用すると、2つの間で切り替えるのは比較的簡単です。結局のところ、どのロギングフレームワークを選択することができますが、その間に特定のロギングフレームワークに依存しない山のコードを書くことができました。

別のフレームワークよりも1つのフレームワークを選択する別の理由は、作業環境です。すでにエンタープライズライブラリの一部を使用している場合は、エンタープライズライブラリのロギングを使用するだけで十分です。

Silverlightで開発している場合はどうなりますか? Clog - part of Calciumのようなものを使用することもできます。 SilverlightとWP7互換のNLog 2.0を使用することもできます。

たSystem.Diagnosticsアドオン(Ukadc.Diagnostics、Essential.Diagnostics)。これらは、それ自体ログフレームワークではありません。むしろ、既存のSystem.Diagnosticsフレームワークで使用できる有用なオブジェクトと拡張ポイントのコレクションを表します。私の意見では、log4netとNLogでどのように書式を設定するかのように、ロギング出力を書式設定する機能が、これらのアドオンのそれぞれに追加されていることが最も良い点の1つです。Essential.Diagnosticsは使用していませんが、Ukadc.Diagnosticsを試してみて、本当にクールだと思います。独自の「書式設定トークン」を書くことも簡単です。

これは完全にあなたの質問に答えるかどうか分かりませんが(それはかなり広いですが)、私は思考のためにたくさんの食べ物があると思います。

+1

+1百万、経験と幅広い知識から来ているようです。 – LamonteCristo

+5

私はこの質問をここで何百回も尋ねられているので、この質問を閉じることに投票したかったのです。しかし、あなたの答えは非常に良いです。それは本当にここで既に与えられた答えに価値を付加します。そのため、投票は終了しませんが、あなたのために+1してください。 – Steven

+0

@スティーブン - 親切な言葉をありがとう! – wageoghe

5

私はVS2010でlog4netを使い始めたばかりで、System.Webに依存していることを発見しました。これにより、 ".NET xx Client Profile"フレームワークターゲットと互換性がなくなります...クライアントプロファイルを.NETの再配布可能ファイルとして使用してWindows Updateを実行すると、大部分のマシンでコードを実行したい場合、log4netをロガーにすることができなくなります...

ありがとうございます他のオプション - 私はそれらをチェックしています...

+0

Thanks Toadflakz forチップ – LamonteCristo

1

私はlog4jまたはlog4netのファンではありません。私はjava.util.netのロギング機能が気に入っています。そのため、NetLogという名前のgithubプロジェクトで、ほとんどの部分をhttps://github.com/greggwon/NetLog/に再作成しました。フィードバックをお寄せください。私は、logging.propertiesファイルのliuにConfigurationManagerベースの設定を入れる時間を作ろうとしています。 java.util.loggingを使用すると、コマンドラインプロパティの設定を使用してログ設定がどこにあるかを指定するだけで、いつでも簡単に実行できました。あなたがConfigurationManagerを使用していない場合は、.netの方がはるかに面倒です。 CMのサポートを提供することで、ロガーとハンドラーの間のいくつかの異なる関係のためにいくつかのことが改善される可能性があります。

NetLogには、システムイベントログに記録するEventLogHandlerが含まれています。 Level.EventLogレベルが "warning"の直下に設定されているため、 "WARNING"または "SEVERE"を使用せずにEventLogを対象とするための名前付き "レベル"を持つことができます。私はTCPSocketHandlerを持っているので、 "ロギング"にtelnetして、 "tail"プログラムを利用することなくウィンドウに "tail"を持たせることができます。ただ、いくつかのことは、マイクロソフトのビルド2013の会議から学んだ追加する

3

:このプロセスは同期であるため、高負荷で

  • log4netのは、主にファイルへの書き込みをしています。特定の条件で競合やタイムアウトを取得することは可能です。これは、AppDynamicsまたは他の同様のツールを使用して検証できます。

  • NLogはロード時にキューイングを実装しないため、IOコールはスタックアップします。

  • マイクロソフトによれば、ETWは非常に効率的なカーネルリングバッファを使用しています。 .NET 4.5およびイベントログフレームワークとSemantic Logging Application Bock (AKA SLAB)を組み合わせることで、これはずっと効率的になります。

+2

あなたの例を挙げてください。 –

+0

@DanEsparza私は私の質問のリンクがすべての引用を持っていると信じています。 – LamonteCristo

+5

私は「特定の条件で競合やタイムアウトが発生する可能性があります」、「NLogは負荷がかかってキューイングを実装していないためIOコールがスタックする」、「Microsoftによると、ETWはカーネルリング非常に効率的なバッファ " –

0

GitHubのNetLog.Loggingパッケージを見てください。それは私の作成です。それは監視アプリケーションを持っていて、java.util.logging APIパラダイムに従っています。なぜなら、これは私が使いたいものですから。 "書き込み"にアクセスするためのスピンロックがあり、ロックホルダは、移動する前に、キューに入れられたすべてのレコードを制限まで書き込みます。これにより、ロギングの競合に基づくI/Oが少なくなり、優れた妥協点が得られます。

0

何らかの理由で、System.Diagnosticsは、すべてのトレース出力を1つのリスナーに送る方法をサポートしていません。複数のソースを同じリスナーに送る場合は、各ソースを名前で明示的にリストする必要があります。

多くの依存関係を持つ大規模なシステムでは、すべてのソースを知っていない可能性があります。おそらく気にしません。あなたは、出力がカバーの下で何が起きているのかを見たいだけです。各ソースのリスナーを個別に設定する必要があるため、System.Diagnosticsを使用すると、大規模なシステムで使用するのがはるかに難しくなります。

log4netは、ルートレベルのアペンダー(リスナー)をサポートするだけでなく、論理的なソースセットのログをグループとして記録できるようにする階層ログをサポートしています。私の考えでは、これはlog4netを明確な選択肢にしています。

関連する問題