2009-06-19 10 views
5

Ứng dụng web của chúng tôi nắm bắt thông tin đăng nhập của người dùng và lưu trữ nó trong biến phiên, tương tự Phiên ("User_Id"). Tôi muốn sử dụng log4net để chụp Người dùng trong nhật ký.Sử dụng log4net với ASP.NET để theo dõi các biến Session

Tôi thấy một vài tham chiếu đến việc sử dụng MDC (Ngữ cảnh chẩn đoán ánh xạ) đã được thay thế bằng thuộc tính ThreadContext.

Có ai đã triển khai phương pháp tiếp cận ThreadContext này không? Bất kỳ đề xuất?

Trả lời

4

Trong mã ...

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

trong 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

Điều này sẽ không hoạt động nếu một yêu cầu được xử lý bởi nhiều hơn một chuỗi, hãy xem: http://www.2geeks1rant.com/2010/11/log4net-contextual-properties-and.html – zvolkov

0

Tôi luôn đóng gói quyền truy cập vào tất cả các biến phiên trong một lớp. Điều này kiểm soát truy cập và hãy để tôi sử dụng gõ mạnh mẽ. Tôi đăng nhập vào lớp này. Dưới đây là một ví dụ:

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

này không giúp tôi giải quyết vấn đề của tôi, nhưng nó chắc chắn là một tốt ý kiến. Chúng tôi cũng đóng gói các phiên của chúng tôi và là một nơi tuyệt vời để thực hiện nó. – proudgeekdad

+0

Tôi thấy tôi đã hiểu sai câu hỏi. Tôi làm một cái gì đó tương tự như câu trả lời của bạn. –