Die Verwendung mit ASP.NET log4net zu verfolgen Session-Variablen
-
06-07-2019 - |
Frage
Unsere Web-App fängt ein Benutzernamen und speichert sie in einer Session-Variablen, ähnlich wie bei Session ( „User_Id“). Ich möchte log4net verwenden, um den Benutzer in das Protokoll aufzunehmen.
Ich sehe ein paar Hinweise auf die MDC mit (Mapped Diagnostic Context) hat mit ThreadContext Eigenschaften ersetzt.
Hat jemand diesen ThreadContext Ansatz umgesetzt? Irgendwelche Vorschläge?
Lösung
Im Code ...
log4net.ThreadContext.Properties["Log_User"] = userName;
in der 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>
Andere Tipps
ich immer Zugriff auf alle Session-Variablen in einer Klasse kapseln. Dieser steuert den Zugriff und lassen Sie sie mir starke Typisierung verwenden. Ich mache jede Protokollierung in dieser Klasse. Hier ein Beispiel:
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); }
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow