4

log4net で奇妙な問題が発生しています。

ASP.NET アプリケーションでは、log4net を外部で構成したいので、別の log4net.config ファイルを用意して、Web アプリに属する​​ AssemblyInfo.cs ファイルに次の行を追加して、Web アプリに接続します。

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

ここで、log4net ロガー クラスを通常の方法でインスタンス化すると、次のようになります。

public class MyClass
{
    private static readonly ILog _logger = log4net.LogManager.GetLogger(typeof(MyClass));
    ....

その後、これは機能し、ロギングは通常どおり機能します。ただし、別のアセンブリ (インフラストラクチャ) の一部である LogManager クラスにログ コードをラップし、多数のプロジェクトで再利用しています。次のような GetLogger があります。

public static class LogManager
{
    public static ILog GetLogger()
    {
        var stack = new StackTrace();
        var frame = stack.GetFrame(1);
        return new log4net.LogManager.GetLogger(frame.GetMethod().DeclaringType);
    }
}

したがって、これを asp.net コードで使用できます。

public class MyClass
{
    private static readonly ILog _logger = LogManager.GetLogger();
    ....

しかし...これはうまくいきません!ログが生成されない 構成ファイルが正しく接続されていないようです。log4net 構成を直接 web.config に入れると、この LogManager は正常に動作します。

4

2 に答える 2

3

ビブが言ったことを要約すると。それはすべてと関係がありlog4net.Config.XmlConfiguratorます。

ロギングを開始する前に、log4netを構成する必要があります。したがって、LogManagerクラスを使用する場合は常に、ホスティングアプリケーション(Windows、Web)がログを構成する 必要があります。

それか、LogManagerでそれを行う必要があります。

于 2011-06-22T11:14:05.883 に答える
2

外部構成ファイルを使用して log4net を構成するようにアプリケーションに指示します。これには、実際には 2 つのスポットがあります。1 つは global.asax、2 番目は assemblyInfo.cs ファイルです。ほとんどの場合、すべてのコードがインライン化された global.asax ファイルから開始することに注意してください。なんらかの理由で、これを機能させる唯一の方法は、global.asax を分解してコード ビハインドを使用し、次に assemblyInfo.cs ファイルを ass することでした。ということで、こんな感じに仕上がります。

global.asax:

<%@ Application Language="C#" Inherits="GlobalAsax" %>

global.asax.cs (in your App_Code folder):

using System;
using System.Web;

public class GlobalAsax : HttpApplication
{
    // you may have lots of other code here
    void Application_Start(object sender, EventArgs e)
    {
        log4net.Config.XmlConfigurator.Configure();
    }
}

アプリケーションが log4net の構成を呼び出すようになったので、アセンブリ情報に属性を設定して、log4net が構成ファイルを探す場所を認識できるようにします。

AssemblyInfo.cs (in your App_Code folder):

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

watch フラグは、変更の可能性がないか構成ファイルを監視するように log4net に指示します。これは、テストの途中ですべてをログに記録する構成からエラーのみに構成を変更する場合に役立ちます。

次に、ロギングを開始します。

于 2011-06-22T11:06:19.523 に答える