سؤال

يلتقط تطبيق الويب الخاص بنا تسجيل دخول المستخدم ويخزنه في متغير جلسة ، على غرار الجلسة ("user_id"). أرغب في استخدام log4net لالتقاط المستخدم في السجل.

أرى بعض الإشارات إلى استخدام MDC (سياق التشخيص المعين) تم استبداله بخصائص ThreadContext.

هل قام أي شخص بتنفيذ نهج ThreadContext هذا؟ أي اقتراحات؟

هل كانت مفيدة؟

المحلول

في الكود ...

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>

نصائح أخرى

أقوم دائمًا بتغليف الوصول إلى جميع متغيرات الجلسة في الفصل. يتحكم هذا في الوصول ودعني أستخدم الكتابة القوية. أفعل أي تسجيل في هذه الفئة. هذا مثال:

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); }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top