.net Log4Net记录跨多个线程的单个会话的IP地址
请参阅:说明如何使用log4net记录IP 我的问题是,在某些情况下,会产生属于会话的额外线程。现在我需要log4net来理解(或线程),以便能够使用正确的IP进行日志记录 当前,当生成一个附加线程时,该线程将以(null)而不是IP的形式记录到日志文件中 如何确保与会话相关的所有线程都知道远程主机的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
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。希望这对其他人有帮助:-)