2009-06-19 21 views
5

Nuestra aplicación web captura el inicio de sesión de un usuario y lo almacena en una variable de sesión, similar a Session ("User_Id"). Me gustaría usar log4net para capturar al usuario en el registro.Uso de log4net con ASP.NET para rastrear las variables de sesión

Veo algunas referencias al uso del MDC (contexto de diagnóstico mapeado) se ha sustituido por las propiedades de ThreadContext.

¿Alguien ha implementado este enfoque ThreadContext? ¿Alguna sugerencia?

Respuesta

4

En el código ...

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

en el 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

Esto no funcionará si una solicitud es manejada por más de un hilo, vea esto: http://www.2geeks1rant.com/2010/11/log4net-contextual-properties-and.html – zvolkov

0

Siempre encapsulo el acceso a todas las variables de sesión en una clase. Esto controla el acceso y vamos a usar una escritura fuerte. Hago cualquier registro en esta clase. He aquí un ejemplo:

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

Esto no ayuda a resolver mi problema, pero es sin duda un buen idea. También encapsulamos nuestras sesiones y es un gran lugar para su implementación. – proudgeekdad

+0

Veo que malinterpreté la pregunta. Hago algo similar a tu respuesta. –

Cuestiones relacionadas