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

Chr*_*rts 24 asp.net logging log4net

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

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

有什么方法可以通过conversionPattern设置appender 来做到这一点吗?%property{??}我有可以使用的设置吗?

更新:这个问题仍未得到解答 - 有没有人有任何想法?

Dan*_*ner 20

Alexander K.几乎是正确的.唯一的问题是该PostAcquireRequestState事件也发生在静态请求中.在这种情况下调用Session会导致a HttpException.

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

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


Ale*_* K. 15

更新(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;
}
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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


kim*_*msk 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;
     }
Run Code Online (Sandbox Code Playgroud)

之后,您可以像这样设置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>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


Ric*_*ett 1

你可以试试:

<conversionPattern
    value="%date %-5level %logger ${COMPUTERNAME} [%property{SessionID}] - %message%newline" />
Run Code Online (Sandbox Code Playgroud)

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

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