문제

당사 웹 앱은 사용자의 로그인을 캡처하고 세션 ( "user_id")과 유사한 세션 변수에 저장합니다. Log4Net을 사용하여 로그에서 사용자를 캡처하고 싶습니다.

MDC (Mapped Diagnostic Context) 사용에 대한 몇 가지 언급이 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