2009-06-19 18 views
5

Web uygulamamız bir kullanıcının oturum açmasını yakalar ve Oturum ("User_Id") benzeri bir oturum değişkeninde saklar. Kullanıcıyı günlüğe kaydetmek için log4net kullanmak istiyorum.Oturum değişkenlerini izlemek için ASP.NET ile log4net'i kullanma

MDC'nin (Mapped Diagnostic Context) kullanılmasının ThreadContext özellikleriyle değiştirildiği birkaç başvuru görüyorum.

Bu ThreadContext yaklaşımını uygulayan var mı? Baska öneri?

cevap

4

... web.config Bu benim sorunu çözmeye yardımcı olmadı

<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

Bir istek birden fazla iş parçacığı tarafından ele alınırsa bu işe yaramaz, bkz: http://www.2geeks1rant.com/2010/11/log4net-contextual-properties-and.html – zvolkov

0

Her zaman bir sınıftaki tüm Oturum değişkenlerine erişimi kapsülleyim. Bu, erişimi denetler ve güçlü yazmayı kullanmama izin verir. Bu derste kayıt yapıyorum. İşte bir örnek: Kodu

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

yılında

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

, ama kesinlikle iyidir fikir. Ayrıca oturumlarımızı da kapsıyoruz ve bunun uygulanması için harika bir yer. – proudgeekdad

+0

Görüyorum ki soruyu yanlış yorumladım. Cevabınıza benzer bir şey yapıyorum. –

İlgili konular