Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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
.net Log4Net记录跨多个线程的单个会话的IP地址_.net_Logging_Log4net_Global Asax - Fatal编程技术网

.net Log4Net记录跨多个线程的单个会话的IP地址

.net Log4Net记录跨多个线程的单个会话的IP地址,.net,logging,log4net,global-asax,.net,Logging,Log4net,Global Asax,请参阅:说明如何使用log4net记录IP 我的问题是,在某些情况下,会产生属于会话的额外线程。现在我需要log4net来理解(或线程),以便能够使用正确的IP进行日志记录 当前,当生成一个附加线程时,该线程将以(null)而不是IP的形式记录到日志文件中 如何确保与会话相关的所有线程都知道远程主机的IP 让会话知道它正在处理的IP地址 当为该会话创建新线程时,在启动之前,在构造函数中或通过setter为其提供IP地址 让线程在开始运行时将该信息放入ThreadContext.Propertie

请参阅:说明如何使用log4net记录IP

我的问题是,在某些情况下,会产生属于会话的额外线程。现在我需要log4net来理解(或线程),以便能够使用正确的IP进行日志记录

当前,当生成一个附加线程时,该线程将以(null)而不是IP的形式记录到日志文件中

如何确保与会话相关的所有线程都知道远程主机的IP

  • 让会话知道它正在处理的IP地址
  • 当为该会话创建新线程时,在启动之前,在构造函数中或通过setter为其提供IP地址
  • 让线程在开始运行时将该信息放入
    ThreadContext.Properties
  • 如果您使用的是线程池,您可能需要稍微修改一下,但基本原理是相同的。

    解决方案是:

    public static class MyLogManager
    {
        public static ILog GetThreadAwareIPLogger(string loggerid)
        {
            if (log4net.ThreadContext.Properties["ip"] == null || !string.IsNullOrEmpty(log4net.ThreadContext.Properties["ip"].ToString()))
                log4net.ThreadContext.Properties["ip"] = HttpContext.Current.Request.UserHostAddress.PadLeft(15);
    
            return LogManager.GetLogger(loggerid);
        }
    }
    
    这只是解决方案的开始。要点是通过在您自己的公共静态类中使用(否则)密封的类来创建一个新的线程感知/会话感知记录器工厂

    我得到一个log4net ILog实例,它知道它是从哪个会话创建/派生的,并在您请求新的记录器时自动在线程的ThreadContext中设置IP。希望这对其他人有帮助:-)