代码之家  ›  专栏  ›  技术社区  ›  Chris Roberts

如何使用asp.net中的log4net在日志文件中包含sessionid?

  •  23
  • Chris Roberts  · 技术社区  · 16 年前

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

    我让log4net为我的web应用程序使用rollinglogfileappender。我正在使用日志记录来尝试找出一些性能问题的来源。为了做到这一点,在日志输出中包含asp.net sessionid会很有用,这样我就可以确保正在查看特定用户的日志条目。

    我有什么办法可以通过 conversionPattern 设置附加程序?有没有 %property{??} 设置我可以使用?

    更新:这个问题仍然没有答案-有人有什么想法吗?

    5 回复  |  直到 10 年前
        1
  •  20
  •   Dan Turner    13 年前

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

    因此,正确的解决方案是:

    protected void Application_PostAcquireRequestState(object sender, EventArgs e)
    {
        if (Context.Handler is IRequiresSessionState)
        {
            log4net.ThreadContext.Properties["SessionId"] = Session.SessionID;
        }
    }
    
        2
  •  14
  •   Alexander K.    10 年前

    更新(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_postcquirerequeststate处理程序(在每个请求中都会调用它):

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

    并将[%property{sessionid}]添加到conversionpattern。

        3
  •  5
  •   kimsk    15 年前

    如果我错了,有人会纠正我,但是一个asp.net线程可以处理多个会话,因此您不能使用会话启动,因为会话启动时会调用一次会话启动。这意味着,一旦不同的用户访问该网站,log4net.threadcontext可能会被新的用户信息覆盖。

    您可以将下面的代码放入application_acquireistate中,或者创建一个httpmodule并在acquireistate方法中执行此操作。当ASP.NET运行时准备好获取当前HTTP请求的会话状态时,调用AcquirerEquestState。如果您对获取用户名感兴趣,可以在AuthenticateQuest中执行此操作,AuthenticateQuest是在ASP.NET运行时准备对用户身份进行身份验证时(并且在收单机构请求状态之前)引发的。

        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>
    

    希望这有帮助!

        4
  •  5
  •   Hari Menon    12 年前

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

        5
  •  1
  •   Richard Ev    16 年前

    你可以试试:

    <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();
    }