4

ASP.NET MVC Web サイトで log4net を使用しています (悪用している可能性があります)。クラスごとに1つのロガーが必要です(ドキュメントが示唆しています)が、クラスごとにロガーを事前に構成する必要があるようです。

そうですか?すべてのロガーを事前定義する必要がありますか?

私は SqlServer に追加しています &Loggerスキーマで名前が付けられた列を確認できます。そのフィールドに好きなものを入れるのはとても簡単なはずですが、私が見つけることができる唯一の動的ロガーの作成はhereです。何か不足していますか?

4

3 に答える 3

5

各ロガーを事前に定義する必要はありません。むしろ従来の方法は、消費クラスでリフレクションを使用してロガーを で宣言する log4net ロガーの標準パターンを使用することTypeです。このプロパティを各クラスにダンプするだけで、準備完了です。

private static log4net.ILog _logger;
private static log4net.ILog Logger
{
    get
    {
        if( _logger == null )
        {
            Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
            _logger = log4net.LogManager.GetLogger( type );
        }
        return _logger;
    }
}
于 2012-10-05T03:27:04.310 に答える
4

クラスごとに 1 つのロガーと言うときは、ログ メッセージの作成に使用されるプログラムによる ILog を参照しています。これらは実際には事前定義する必要がありますが、Metro Smurf が提供したアプローチと同じくらい簡単です。

private static ILog logger = 
   LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

これらのアプローチのいずれかで、ロガーが構成されます。リフレクションを使用して現在のメソッドのクラス名を取得し、それをロガー名として使用するため、アプローチを「動的」と呼びます。これは、次のようにコーディングすることもできます (ただし、コードはクラスごとに異なり、リフレクション メソッドを使用するとスニペットとして簡単に実行できます)。

private static ILog logger = LogManager.GetLogger(typeof(MyCurrentClass));

「私が欲しいものは何でも入れてください」についてのあなたのコメントによると、ILogインスタンスを作成するときにも非常に簡単にそれを行うことができます(しゃれを許してください)。

private static ILog logger = LogManager.GetLogger("whatever I want");

含めるリンクは、ILog ロガーを作成するだけでなく、それに付随するアペンダーも作成します。アペンダーは実行時に web.config または app.config でより簡単に構成でき、通常はすべてのロガー出力で 1 つまたは 2 つ以上のアペンダーを使用する必要はないため、これは良い習慣ではないと思います。アペンダーに行きます。

于 2012-10-05T13:07:05.750 に答える
1

ここでの「動的」な側面は何ですか?ロガーを使用するにはデータベース接続をインスタンス化する必要があるのと同じように、ロガーをインスタンス化して使用する必要があります。残りは名前の問題です。

Log4netを使用すると、ソフトウェアコンポーネントごとにロガーに簡単に名前を付けることができます。これは、各クラスでロガーを静的にインスタンス化することで実現できます。ロガー名は、クラスの完全修飾名と同じです。これは、ロガーを定義するための便利で簡単な方法です。

于 2012-10-05T02:06:24.647 に答える