2009-06-19 7 views
5

Nasza aplikacja internetowa przechwytuje login użytkownika i zapisuje go w zmiennej sesji, podobnie do Sesji ("User_Id"). Chciałbym użyć log4net do przechwycenia użytkownika w logu.Używanie log4net z ASP.NET do śledzenia zmiennych sesji

Widzę, że kilka odwołań do używania MDC (Zmapowany kontekst diagnostyczny) zostało zastąpione właściwościami ThreadContext.

Czy ktoś zaimplementował podejście ThreadContext? Jakieś sugestie?

Odpowiedz

4

W kodzie ...

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

w 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

To nie zadziała, jeśli jedno żądanie zostanie obsłużone przez więcej niż jeden wątek, zobacz: http://www.2geeks1rant.com/2010/11/log4net-contextual-properties-and.html – zvolkov

0

Zawsze hermetyzuję dostęp do wszystkich zmiennych sesji w klasie. Kontroluje to dostęp i używajmy silnego pisania. Robię jakiekolwiek logowanie w tej klasie. Oto przykład:

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

To nie pomoże mi rozwiązać mój problem, ale jest to z pewnością dobry pomysł. Zamykamy również nasze sesje i jest to doskonałe miejsce do jego realizacji. – proudgeekdad

+0

Widzę, że źle zinterpretowałem pytanie. Robię coś podobnego do twojej odpowiedzi. –

Powiązane problemy