2013-04-05 9 views
23

log4net 1.2.11.0log4net eindeutigen Anforderungs-ID in ASP.NET

Ich versuche, etwas zu bekommen, die mich mit einem eindeutigen Wert für jede Anforderung von ASP.NET anmelden kann.

Ich probierte% Thread, aber Threads scheinen wiederverwendet zu werden.

Ich habe% aspnet-request und% aspnet-session versucht, die nichts sinnvolles in ihnen haben.

Ich sah ThreadContext.Properties und LogicalThreadContext.Properties, aber sie haben auch nichts in ihnen.

Jeder hat einen Trick, um dies zu erledigen? Ich brauche die Möglichkeit, die Logs einer bestimmten Anfrage aus der Log-Datei zu holen.

+2

Guid, ein frisches. –

+0

Das ist nicht hilfreich. Eine Methode, von der ich hoffe, dass sie funktioniert, besteht darin, einen Thread-Interlocked-Counter zu haben, den ich verwende, um den Thread-Namen bei jeder Anfrage festzulegen, und% Thread scheint korrekt auszugeben. Dies führt zu der Annahme, dass meine Anfrage in einem einzigen Thread ausgeführt wird. – LiteWait

+0

Noch schlimmer, da Dinge in einem Thread-Pool ausgeführt werden, können Sie den Thread-Namen nur einmal festlegen! (Seltsamerweise scheint dies bei .Net zu funktionieren und schlägt bei Mono fehl) – LiteWait

Antwort

5

clock tick + process ID + thread ID wie gespeichert, wenn Sie Ihre Anfrage beginnt ausreichend sein sollte, denke ich (vorausgesetzt, jeden Thread 1 Anfrage zu einem Zeitpunkt behandelt).

22

.asmx Dateien rufen noch Application_BeginRequest Veranstaltung, wo Sie Ihre einzigartige GUID in HttpContext.Current.Items speichern kann (unter Verwendung dieser Sammlung die ungeraden Problem vermeiden, wenn die Anforderung Verarbeitungsthreads Sprünge). Nur wenn Sie WCF verwenden (und auch dann hängt es von der Konfiguration ab), würde dies nicht funktionieren.

Wenn Sie die Anwendung nicht selbst berühren möchten, können Sie HttpContext.Current.Timestamp verwenden, die den Zeitpunkt zurückgibt, an dem die Anfrageverarbeitung gestartet wurde. Verbinden Sie dies mit Ihrem bestehenden Ansatz, die ID des Threads zu erhalten, und Sie erhalten einen eindeutigen Wert.

7

HttpContext.Current.Items - ist eine gute Idee.

Versuche so etwas hinzuzufügen:

HttpContext.Current.Items.Add("RequestIdentity", Guid.NewGuid().ToString()) 
1

Hier einige Erweiterungsmethoden, die ich für diesen Zweck erstellt:

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]; 
    } 
} 
Verwandte Themen