2009-06-19 6 views
5

La nostra app Web acquisisce il login di un utente e lo memorizza in una variabile di sessione, simile a Session ("User_Id"). Mi piacerebbe utilizzare log4net per catturare l'utente nel registro.Utilizzo di log4net con ASP.NET per tenere traccia delle variabili di sessione

Vedo alcuni riferimenti all'utilizzo di MDC (Mapped Diagnostic Context) è stato sostituito con proprietà ThreadContext.

Qualcuno ha implementato questo approccio ThreadContext? Eventuali suggerimenti?

risposta

4

Nel codice ...

log4net.ThreadContext.Properties["Log_User"] = userName; 

nel web.config

<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> 
    <bufferSize value="1" /> 
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    <connectionString value="set in global.asax" /> 
    <commandText value="INSERT INTO Log4Net ([Log_Date], [Severity],[Application],[Message], [Source], [Log_User]) VALUES (@log_date, @severity, @application, @message, @source, @currentUser)" /> 
    <parameter> 
    <parameterName value="@log_date" /> 
    <dbType value="DateTime" /> 
    <layout type="log4net.Layout.RawTimeStampLayout" /> 
    </parameter> 
    ... 
    <parameter> 
    <parameterName value="@currentUser" /> 
    <dbType value="String" /> 
    <size value="100" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%property{Log_User}" /> 
    </layout> 
    </parameter> 
</appender> 
+3

Questo non funzionerà se una richiesta è gestita da più di un thread, vedere questo: http://www.2geeks1rant.com/2010/11/log4net-contextual-properties-and.html – zvolkov

0

Incapsulo sempre l'accesso a tutte le variabili Session di una classe. Questo controlla l'accesso e consentitemi di usare una forte digitazione. Faccio qualsiasi registrazione in questa classe. Ecco un esempio:

public static class SessionInfo 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(SessionInfo)); 

    private const string AUDITOR_ID_KEY = "AuditorId"; 

    static SessionInfo() 
    { 
     log.Info("SessionInfo created"); 
    } 

    #region Generic methods to store and retrieve in session state 

    private static T GetSessionObject<T>(string key) 
    { 
     object obj = HttpContext.Current.Session[key]; 
     if (obj == null) 
     { 
      return default(T); 
     } 
     return (T)obj; 
    } 

    private static void SetSessionObject<T>(string key, T value) 
    { 
     if (Equals(value, default(T))) 
     { 
      HttpContext.Current.Session.Remove(key); 
     } 
     { 
      HttpContext.Current.Session[key] = value; 
     } 
    } 

    #endregion 

    public static int AuditorId 
    { 
     get { return GetSessionObject<int>(AUDITOR_ID_KEY); } 
     set { SetSessionObject<int>(AUDITOR_ID_KEY, value); } 
    } 
} 
+0

Questo non ha aiutato a risolvere il mio problema, ma è sicuramente un buon idea. Incapsuliamo anche le nostre sessioni ed è un ottimo posto per la sua implementazione. – proudgeekdad

+0

Vedo che ho erroneamente interpretato la domanda. Faccio qualcosa di simile alla tua risposta. –