Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从单独项目中的单例调用log4net会停止所有日志记录_C#_Singleton_Log4net - Fatal编程技术网

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

C# 从单独项目中的单例调用log4net会停止所有日志记录,c#,singleton,log4net,C#,Singleton,Log4net,该应用程序是一个WinForms.net 3.5应用程序,包含多个项目、一个主项目和多个库项目。如果我从一个子项目中存在的单例调用log4net,它会导致所有日志停止 更新 基于一些注释,我以以下方式更改了TestSingletonLog4net类。这些变化仍然存在问题 正如Jon Skeet指出的那样,使测试类线程安全 更改了成员声明并添加了log4net.Config.XmlConfigurator.Configure();按照Norla的示例进行配置调用,结果相同,但每次调用都会停止所有

该应用程序是一个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,结果相同

我的设置重置如下

下一行就在my 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);

非常感谢对解决方案的任何建议。

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

在成员声明中:

public static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(typeof (TestSingletonLog4Net));
在构造函数中:

log4net.Config.XmlConfigurator.Configure();

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

您应该只调用
log4net.Config.XmlConfigurator.Configure()
此外,如果要调用
log4net.Config.XmlConfigurator.Configure()应删除以下行:

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

首先,您的单例实现不是线程安全的……我最初是在使用通过IOC容器实现为单例的不同类时发现这个问题的。我只是做了这个测试类来复制这个问题,没有IOC的干扰。谢谢,尝试了你的示例,更新的代码在上面的帖子中仍然不起作用。你的单身汉是在一个单独的项目中吗?刚刚在一个引用另一个项目中的记录器的解决方案中发现了这个gem。祝你好运log4net.GlobalContext.Properties[“LogName”]=System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;