首页 > 解决方案 > log4net 上下文设置。如何向任务并行库生成的子线程传播上下文

问题描述

我正在使用以下代码设置 log4net 上下文

 public static IDisposable ThreadContextSet(string key, object value)
        {
            //object oldVal = ThreadContext.Properties[key];
            ThreadContext.Properties[key] = value;
            var topMostCleaner = new DispCleaner();
            topMostCleaner.EvDispose += () => {
                // Pop = restore old value
                //ThreadContext.Properties[key] = oldVal;
                ThreadContext.Properties[key] = null;
            };
            return topMostCleaner;
        }

        private class DispCleaner : IDisposable
        {
            public event Action EvDispose;

            public void Dispose()
            {
                if (EvDispose != null)
                {
                    EvDispose();
                }
            }
        }

问题是当我从方法创建子线程时,上下文没有转移到那些线程。

喜欢

public void InitiateTransaction(InitiateTransactionRequest info)
{
..
...
                using (Log4NetExt.ThreadContextSet(StringConstants.Log4NetContextConstants.Ip, this.RequestIp))
                using (Log4NetExt.ThreadContextSet(StringConstants.Log4NetContextConstants.TransactionMsisdn, msisdn))
                using (Log4NetExt.ThreadContextSet(StringConstants.Log4NetContextConstants.TransactionId, transactionId))
                {

                ...
                ....

                Task.Factory.StartNew(() => ProcessTransactionAync()); // context not transfer
                }

}

任何机构都可以帮助我吗

标签: c#.netlog4net

解决方案


我已将代码从 ThreadContext.Properties 更改为 LogicalThreadContext.Properties 看起来它正在工作

解决方案的参考链接是Log4Net 的 ThreadContext 和 Task 之间的冲突


推荐阅读