باستخدام log4net مع ASP.NET لتتبع متغيرات الجلسة
-
06-07-2019 - |
سؤال
يلتقط تطبيق الويب الخاص بنا تسجيل دخول المستخدم ويخزنه في متغير جلسة ، على غرار الجلسة ("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); }
}
}
لا تنتمي إلى StackOverflow