Как включить SessionID в файлы журнала, используя log4net в ASP.NET? - PullRequest
23 голосов
/ 12 декабря 2008

Я новичок в log4net, так что, надеюсь, для кого-то это действительно простой вопрос?!

У меня есть log4net, работающий с RollingLogFileAppender для моего веб-приложения. Я использую ведение журнала, чтобы попытаться найти причины проблем с производительностью. Для этого было бы полезно включить ASP.NET SessionID в вывод журнала, чтобы я мог убедиться, что смотрю записи журнала для конкретного пользователя.

Есть ли способ сделать это через настройку conversionPattern для appender? Можно ли использовать настройку %property{??}?

ОБНОВЛЕНИЕ: На этот вопрос все еще не ответили - у кого-нибудь есть какие-нибудь идеи?

Ответы [ 5 ]

20 голосов
/ 16 марта 2011

Александр К. почти прав. Единственная проблема заключается в том, что событие PostAcquireRequestState также происходит для статических запросов. Вызов Session в этой ситуации вызовет HttpException.

Поэтому правильное решение становится:

protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
    if (Context.Handler is IRequiresSessionState)
    {
        log4net.ThreadContext.Properties["SessionId"] = Session.SessionID;
    }
}
14 голосов
/ 17 мая 2009

ОБНОВЛЕНИЕ (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


Вы должны создать обработчик Application_PostAcquireRequestState в Global.asax.cs (он вызывается при каждом запросе):

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

И добавьте [% property {SessionID}] в translationPattern.

5 голосов
/ 11 июня 2012

Я тоже искал ответ на этот вопрос и обнаружил, что %aspnet-request{ASP.NET_SessionId} отлично работает для меня.

5 голосов
/ 25 июля 2009

Кто-то исправляет меня, если я ошибаюсь, но один поток ASP.NET может обрабатывать несколько сеансов, поэтому вы не можете использовать Session_Start, поскольку он вызывается один раз при запуске сеанса. Это означает, что, как только другой пользователь заходит на веб-сайт, ваш log4net.ThreadContext может быть перезаписан информацией о новом пользователе.

Вы можете поместить приведенный ниже код в Application_AcquireRequestState или создать HttpModule и сделать это в методе AcquireRequestState. AcquireRequestState вызывается, когда среда выполнения ASP.NET готова к получению состояния сеанса текущего HTTP-запроса. Если вы заинтересованы в получении имени пользователя, вы можете сделать это в 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>

Надеюсь, это поможет!

1 голос
/ 12 декабря 2008

Вы можете попробовать:

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