24

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

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

有什么办法可以通过附加程序的conversionPattern设置来做到这一点?有%property{??}我可以使用的设置吗?

更新:这个问题仍然没有得到回答——有人有什么想法吗?

4

5 回答 5

20

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

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

protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
    if (Context.Handler is IRequiresSessionState)
    {
        log4net.ThreadContext.Properties["SessionId"] = Session.SessionID;
    }
}
于 2011-03-16T05:08:45.967 回答
16

更新(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。

于 2009-05-16T23:10:08.090 回答
6

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

于 2012-06-11T07:02:07.357 回答
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>

希望这可以帮助!

于 2009-07-24T22:42:59.373 回答
1

You can try:

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

...in your Web.config, and in Global.asax.cs:

protected void Session_Start(object sender, EventArgs e)
{
    log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
    log4net.Config.XmlConfigurator.Configure();
}
于 2008-12-12T11:38:24.253 回答