该应用程序是一个WinForms .net 3.5应用程序,包含多个项目,一个主项目和多个库项目。如果我从其中一个子项目中存在的单例调用log4net,则会导致所有日志记录停止。
更新
根据一些评论,我通过以下方式更改了TestSingletonLog4net类。这些变化仍然存在问题。
以下是重现该问题的更新类。
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;
}
}
}
我设置了一个小项目来复制问题,这就是正在发生的事情。
我最初将log4net配置作为app.config的一部分,但我怀疑它可能是一个问题所以我将log4net配置移动到它自己的配置文件中。
使用log4net 1.2.11版
我也试过从构造函数外部调用log并得到相同的结果。
重置我的设置如下。
以下行就在我的Program.cs
中的using语句下面[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
在每个班级中,我使用:
调用log4netprivate static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
非常感谢任何有关决议的建议。
答案 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();
就是这样。到目前为止还没有任何问题。如果这样做/不起作用,请告诉我。