如何在ASP.NET中使用log4net在日志文件中包含SessionID?

时间:2008-12-12 10:58:31

标签: asp.net logging log4net

我是log4net的新手,所以希望对某人来说这是一个非常简单的问题?!​​

我的log4net正在使用RollingLogFileAppender为我的Web应用程序。我正在使用日志记录来尝试查找某些性能问题的来源。为了做到这一点,在日志输出中包含ASP.NET SessionID是有用的,这样我就可以确保我正在查看特定用户的日志条目。

有什么办法可以通过appender的conversionPattern设置来实现这个目的吗?我可以使用%property{??}设置吗?

更新:此问题仍未得到解答 - 是否有任何想法?

5 个答案:

答案 0 :(得分:20)

亚历山大·K几乎是正确的。唯一的问题是静态请求也会发生PostAcquireRequestState事件。在这种情况下调用Session将导致HttpException

因此正确的解决方案变为:

protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
    if (Context.Handler is IRequiresSessionState)
    {
        log4net.ThreadContext.Properties["SessionId"] = Session.SessionID;
    }
}

答案 1 :(得分:14)

更新(2014-06-12):从log4net 1.2.11开始,您可以在转换模式中使用%aspnet-request{ASP.NET_SessionId}来实现此目的。

参考文献: https://issues.apache.org/jira/browse/LOG4NET-87 http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html


您应该在Global.asax.cs中创建Application_PostAcquireRequestState处理程序(在每个请求中调用它):

protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
    log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
}

并将[%property {SessionID}]添加到conversionPattern。

答案 2 :(得分:5)

如果我错了,有人会纠正我,但是一个ASP.NET线程可以处理多个会话,所以你不能使用Session_Start,因为它在会话启动时被调用一次。这意味着只要不同的用户访问该网站,您的log4net.ThreadContext就可能被新的用户信息覆盖。

您可以将以下代码放在Application_AcquireRequestState中,也可以创建HttpModule并在AcquireRequestState方法中执行此操作。当ASP.NET运行时准备好获取当前HTTP请求的会话状态时,将调用AcquireRequestState。如果您对获取用户名感兴趣,可以在AuthenticateRequest中执行该操作,这是在ASP.NET运行时准备好验证用户身份(以及在AcquireRequestState之前)时引发的。

    private void AcquireRequestState(Object source, EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        log4net.ThreadContext.Properties["SessionId"] = context.Session.SessionID;
     }

之后,您可以像这样设置log4net.config(或web.config)。

<appender name="rollingFile"
      type="log4net.Appender.RollingFileAppender,log4net" >
  <param name="AppendToFile" value="false" />
  <param name="RollingStyle" value="Date" />
  <param name="DatePattern" value="yyyy.MM.dd" />
  <param name="StaticLogFileName" value="true" />

  <param name="File" value="log.txt" />
  <layout type="log4net.Layout.PatternLayout,log4net">
    <param name="ConversionPattern"
      value="%property{SessionId} %d [%t] %-5p %c - %m%n" />
  </layout>
</appender>

希望这有帮助!

答案 3 :(得分:5)

我也在寻找答案,并发现%aspnet-request{ASP.NET_SessionId}对我来说很好。

答案 4 :(得分:1)

您可以尝试:

<conversionPattern
    value="%date %-5level %logger ${COMPUTERNAME} [%property{SessionID}] - %message%newline" />

...在您的Web.config和Global.asax.cs中:

protected void Session_Start(object sender, EventArgs e)
{
    log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
    log4net.Config.XmlConfigurator.Configure();
}