【问题标题】:Using log4net with ASP.NET to track Session variables使用带有 ASP.NET 的 log4net 来跟踪 Session 变量
【发布时间】:2009-06-23 03:43:52
【问题描述】:

我们的网络应用程序捕获用户的登录信息并将其存储在会话变量中,类似于 Session("User_Id")。我想使用 log4net 来捕获日志中的用户。

我看到一些使用 MDC(映射诊断上下文)的引用已被 ThreadContext 属性替换。

有没有人实现过这种 ThreadContext 方法?有什么建议吗?

【问题讨论】:

    标签: asp.net log4net session-variables


    【解决方案1】:

    在代码中...

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

    在 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>
    

    【讨论】:

    【解决方案2】:

    我总是将对所有 Session 变量的访问封装在一个类中。这控制访问,让我使用强类型。我在这门课上做任何日志记录。这是一个例子:

    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); }
        }
    }
    

    【讨论】:

    • 这并没有帮助我解决我的问题,但这绝对是一个好主意。我们还封装了我们的会话,是实现它的好地方。
    • 我明白我误解了这个问题。我做了类似于你的回答的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多