1

ThreadContext.Properties を使用してユーザーごとのセッションを設定する方法を見つけようとしています。

ユーザーが Web サイトにログインすると、ユーザー ID がセッションに保存されます。この値は、ログインが成功した後に ThreadContext.Properties["UserID"] に追加したいと考えています。

adonetappender を使用してログ エントリを db に保存しており、%property{userid} を使用して値を取得しています。ただし、この値が null と読み取られる場合があります。

だから基本的に私が欲しいのは:

1) を作成する

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

ログに記録したいページで。

2) ログインが成功したら、ThreadContext.Properties["UserID"] に値を格納する必要があります。この値は、ユーザー セッション全体で常に存在し、ログに記録したページと、global_asax の Application_Error(...) の両方から利用できます。 . とにかく、この ThreadContext の寿命はどれくらいですか? 私が知る限り、GlobalContext は実際には使用できません。

3) すべてのログ ステートメントで値を再割り当てしたくありません。

私がどこに向かっているのか、あなたが理解してくれることを願っています。

//ダニエル

4

1 に答える 1

0

ここで私の答えを見てください:

log4net でユーザー名を取得する

あなたを助けるかもしれないいくつかのアイデアのために。最後のアイデアはおそらく最も単純であり、ニーズを満たす可能性があるため、最後まで読んでください。

要約すると、私は最初に、HttpContext に格納された値のログ記録を可能にするカスタム PatternLayoutConverter、HttpContextPatternLayoutConverter を作成することを提案しました。

私の回答の終わりに向かって、GlobalDiagnosticContext (または ThreadDiagnosticContext については ThreadDiagnosticContext) に格納できるクラスを作成する方法を示す別のブログ投稿 (私の元の回答にリンクされています) に基づいたソリューションを提案しました。その GlobalDiagnosticContext パラメータをログに記録するように log4net に指示すると、log4net はオブジェクトにアクセスし、その ToString メソッドを呼び出します。オブジェクト自体は、HttpContext から値を抽出するだけです。

したがって、HttpContext を使用してログに記録したい情報を保存できる場合は、リンクされた回答が役立つ可能性があります。HttpContext を使用して情報を保存できない場合、私の答えはおそらく役に立たないでしょう。

幸運を!

于 2012-08-16T15:26:31.177 に答える