Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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#_Log4net - Fatal编程技术网

C# log4net自定义属性不适用于多线程应用程序

C# log4net自定义属性不适用于多线程应用程序,c#,log4net,C#,Log4net,我有一个应用程序正在使用log4net AdoNetAppender(DB appender)将日志写入数据库。它正在将记录写入数据库,但自定义字段均为空。在我的单元测试中使用相同的代码,它们工作得很好,但在应用程序运行时调用它们时就不行了。它是一个多线程应用程序,处理消息队列中的消息 关于具有多线程应用程序的DB appender的自定义属性,是否存在任何已知问题(任何人都知道)?这是我唯一的猜测,因为我不能在单元测试中复制,所以当应用程序启动时,它们为什么不能工作 默认的log4net字段可

我有一个应用程序正在使用log4net AdoNetAppender(DB appender)将日志写入数据库。它正在将记录写入数据库,但自定义字段均为空。在我的单元测试中使用相同的代码,它们工作得很好,但在应用程序运行时调用它们时就不行了。它是一个多线程应用程序,处理消息队列中的消息

关于具有多线程应用程序的DB appender的自定义属性,是否存在任何已知问题(任何人都知道)?这是我唯一的猜测,因为我不能在单元测试中复制,所以当应用程序启动时,它们为什么不能工作

默认的log4net字段可以正常运行

我正在单例中设置自定义属性值:

   public sealed class Logger
    {
        private static readonly Logger instance = new Logger();
        public static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);


        /// <summary>
        /// Static constructor which sets the properties for the database logging using log4net. This enables analysts to view the log events
        /// inside the database as well as in the local application log file. 
        /// </summary>
        static Logger()
        {
            GlobalContext.Properties["Application"] = "MyApp";
            GlobalContext.Properties["ApplicationVersion"] = Utility.GetApplicationVersion();
            var windowsHost = System.Net.Dns.GetHostName();
            if (!String.IsNullOrEmpty(windowsHost))
                LogicalThreadContext.Properties["Host"] = windowsHost;
            //ThreadContext.Properties["LogTime"] = DateTime.Now;
            var windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
            if (windowsIdentity != null)
                GlobalContext.Properties["CreatedBy"] = windowsIdentity.Name;
        }

        private Logger()
        {

        }

        public static Logger Instance
        {
            get { return instance; }
        }
    }

在log4nets内部日志中没有看到任何错误,因此仍然不清楚发生了什么

我终于明白了。这就是我们试图全局设置自定义属性的方式。相反,在我的任何实例绑定到队列并处理消息之前,我会在应用程序启动时设置属性。我不知道为什么一开始我没有想到这一点。刚刚使用了log4net GlobalContext,工作起来很有魅力

--

http://logging.apache.org/log4net/release/faq.html#internalDebug