从单独项目中的单例调用log4net会停止所有日志记录

时间:2012-06-20 18:42:54

标签: c# singleton log4net

该应用程序是一个WinForms .net 3.5应用程序,包含多个项目,一个主项目和多个库项目。如果我从其中一个子项目中存在的单例调用log4net,则会导致所有日志记录停止。

更新

根据一些评论,我通过以下方式更改了TestSingletonLog4net类。这些变化仍然存在问题。

  • 使Jon Skeet指出这一点,使测试类线程安全。
  • 更改了成员声明并添加了log4net.Config.XmlConfigurator.Configure();根据Norla的例子,配置调用具有相同的结果,仍然只要它被称为所有记录停止。

以下是重现该问题的更新类。

    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。
  • 如果我尝试使用其中一个子项目库中的单例的log4net,则所有日志记录都会停止,不仅不会记录,而且从主项目完成的记录也不再有效。

我最初将log4net配置作为app.config的一部分,但我怀疑它可能是一个问题所以我将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);

非常感谢任何有关决议的建议。

2 个答案:

答案 0 :(得分:1)

您应该只在应用程序中调用log4net.Config.XmlConfigurator.Configure(); 一次时间。这应该在主应用程序中调用,而不是在包含单例的类中调用。

此外,如果您打算致电log4net.Config.XmlConfigurator.Configure();,则应删除以下行:

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

答案 1 :(得分:0)

我有一个使用log4net的单例对象。这就是我正在做的事情。

在会员声明中:

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

在构造函数中:

log4net.Config.XmlConfigurator.Configure();

就是这样。到目前为止还没有任何问题。如果这样做/不起作用,请告诉我。