26

log4net 1.2.11.0

ASP.NET 要求ごとに一意の値でログに記録できるものを取得しようとしています。

%thread を試しましたが、スレッドが再利用されているようです。

%aspnet-request と %aspnet-session を試しましたが、意味のあるものは何もありません。

ThreadContext.Properties と LogicalThreadContext.Properties を見ましたが、どちらにも何もありません。

誰でもこれを行うためのトリックを持っていますか? ログ ファイルから特定の要求のログを選択する機能が必要です。

4

4 に答える 4

23

.asmxApplication_BeginRequestファイルは、一意の GUID を格納できるイベントを引き続き呼び出しますHttpContext.Current.Items(このコレクションを使用すると、要求処理がスレッドをジャンプするときの奇妙な問題を回避できます)。WCF を使用している場合 (および構成に依存する場合) のみ、これは機能しません。

アプリケーション自体に触れたくないHttpContext.Current.Timestamp場合は、リクエスト処理が開始された時刻を返すを使用できます。スレッドの ID を取得する既存のアプローチと結合すると、一意の値が得られます。

于 2013-04-15T15:36:26.210 に答える
6

clock tick+ process ID+thread IDリクエストの開始時に保存されたもので十分だと思います (各スレッドが一度に 1 つのリクエストを処理すると仮定します)。

于 2013-04-19T18:07:58.483 に答える
2

この目的のために作成したいくつかの拡張メソッドを次に示します。

public static Guid GetId(this HttpContext ctx) => new HttpContextWrapper(ctx).GetId();

public static Guid GetId(this HttpContextBase ctx)
{
    const string key = "tq8OuyxHpDgkRg54klfpqg== (Request Id Key)";

    if (ctx.Items.Contains(key))
        return (Guid) ctx.Items[key];

    var mutex = string.Intern($"{key}:{ctx.GetHashCode()}");
    lock (mutex)
    {
        if (!ctx.Items.Contains(key))
            ctx.Items[key] = Guid.NewGuid();

        return (Guid) ctx.Items[key];
    }
}
于 2015-11-22T15:05:21.223 に答える