0

アプリケーションは、複数のプロジェクト、1 つのメイン プロジェクト、および複数のライブラリ プロジェクトを持つ WinForms .net 3.5 アプリです。サブプロジェクトの 1 つに存在するシングルトンから log4net を呼び出すと、すべてのロギングが停止します。

アップデート

いくつかのコメントに基づいて、TestSingletonLog4net クラスを次のように変更しました。これらの変更にはまだ問題があります。

  • Jon Skeet が指摘したように、テスト クラスをスレッド セーフにしました。
  • メンバー宣言を変更し、log4net.Config.XmlConfigurator.Configure(); を追加しました。Norla の例に従って config を呼び出すと、同じ結果が得られますが、呼び出されるたびにすべてのロギングが停止します。

問題を再現するために更新されたクラスを次に示します。

    public class TestSingletonLog4Net
{
    private static volatile TestSingletonLog4Net instance;
    private static object syncRoot = new Object();

    public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(TestSingletonLog4Net));

    private  TestSingletonLog4Net()
    {
        log4net.Config.XmlConfigurator.Configure();

        log.Info("Test write from singleton");
    }
    public static TestSingletonLog4Net Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                        instance = new TestSingletonLog4Net();
                }
            }

            return instance;
        }
    }
}

問題を再現するために小さなプロジェクトをセットアップしました。これが起こっていることです。

  • メインUIプロジェクトからlog4netをシングルトンまたは通常のクラスロギングで使用すると動作します。
  • シングルトンロギングではないサブプロジェクトライブラリからlog4netを使用すると機能します。
  • サブプロジェクト ライブラリの 1 つにあるシングルトンから log4net を使用しようとすると、すべてのログが停止し、ログが記録されないだけでなく、メイン プロジェクトからのログも機能しなくなります。

私はもともと app.config の一部として log4net 構成を持っていましたが、問題があるのではないかと疑ったので、log4net 構成を独自の構成ファイルに移動しました。

log4net バージョン 1.2.11 の使用

また、コンストラクターの外部から log を呼び出してみましたが、同じ結果が得られました。

私のセットアップのリセットは以下のとおりです。

次の行は、私の Program.cs の using ステートメントのすぐ下にあります。

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

各クラスで、次のように log4net を呼び出しています。

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

解決のためのアドバイスは大歓迎です。

4

2 に答える 2

1

log4net.Config.XmlConfigurator.Configure(); アプリケーションで1回だけ呼び出す必要があります。これは、シングルトンを含むクラスではなく、メインアプリケーションで呼び出す必要があります。

さらに、電話をかける場合はlog4net.Config.XmlConfigurator.Configure();、次の行を削除する必要があります。

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
于 2012-06-20T22:41:38.967 に答える
0

log4netを使用するシングルトンオブジェクトがあります。これが私がしていることです。

メンバー宣言の場合:

public static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(typeof (TestSingletonLog4Net));

コンストラクター内:

log4net.Config.XmlConfigurator.Configure();

それでおしまい。これまで問題はありませんでした。これが機能する/機能しない場合はお知らせください。

于 2012-06-20T19:08:22.070 に答える