2

请参考:如何使用 Log4Net 启用 IP 地址记录,其中解释了如何使用 log4net 记录 IP。

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

目前,当产生一个额外的线程时,线程将作为 (null) 而不是 IP 记录到日志文件中。

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

4

2 回答 2

4

解决方案是:

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。希望这对其他人有帮助:-)

于 2009-11-26T22:34:55.163 回答
1
  1. 让会话知道它正在处理的 IP 地址。
  2. 当为该会话创建一个新线程时,在它启动之前,在构造函数中或通过 setter 为其提供 IP 地址。
  3. 让线程在ThreadContext.Properties开始运行时放入该信息。

如果您使用线程池,您可能需要稍微修改一下,但基本原理是相同的。

于 2009-11-25T21:33:16.137 回答