请参考:如何使用 Log4Net 启用 IP 地址记录,其中解释了如何使用 log4net 记录 IP。
我的问题是,在某些情况下,会产生属于会话的额外线程。现在我需要 log4net 来理解(或线程)能够使用正确的 IP 登录。
目前,当产生一个额外的线程时,线程将作为 (null) 而不是 IP 记录到日志文件中。
如何确保与 Session 相关的所有线程都知道远程主机的 IP?
请参考:如何使用 Log4Net 启用 IP 地址记录,其中解释了如何使用 log4net 记录 IP。
我的问题是,在某些情况下,会产生属于会话的额外线程。现在我需要 log4net 来理解(或线程)能够使用正确的 IP 登录。
目前,当产生一个额外的线程时,线程将作为 (null) 而不是 IP 记录到日志文件中。
如何确保与 Session 相关的所有线程都知道远程主机的 IP?
解决方案是:
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 实例,它知道它是从哪个 Session 创建/生成的,并在您请求新记录器时自动在线程的 ThreadContext 中设置 IP。希望这对其他人有帮助:-)
ThreadContext.Properties
开始运行时放入该信息。如果您使用线程池,您可能需要稍微修改一下,但基本原理是相同的。