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?

War es hilfreich?

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
scroll top