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

时间:2009-11-25 13:44:24

标签: .net logging log4net global-asax

请参阅:How to enable IP address logging with Log4Net,其中介绍了如何使用log4net登录IP。

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

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

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

2 个答案:

答案 0 :(得分: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);
    }
}

这只是解决方案的一个开始。重点是通过在您自己的公共静态类中使用(否则)密封类来创建一个新的Thread-Aware / Session-Aware Logger-factory。

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

答案 1 :(得分:2)

  1. 让会话知道它正在处理的IP地址。
  2. 为该会话创建新线程时,在启动之前,在构造函数中或通过setter为其提供IP地址。
  3. 让线程在ThreadContext.Properties开始运行时将该信息放入。{/ li>

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