请参阅:How to enable IP address logging with Log4Net,其中介绍了如何使用log4net登录IP。
我的问题是,在某些情况下会产生属于会话的额外线程。现在我需要log4net来理解(或线程)能够使用正确的IP进行记录。
目前,当产生一个额外的线程时,线程将日志文件记录为(null)而不是IP。
如何确保与会话相关的所有线程都知道远程主机的IP?
答案 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)
ThreadContext.Properties
开始运行时将该信息放入。{/ li>
醇>
如果您使用的是线程池,则可能需要稍微修改一下,但基本原则是相同的。