Log4Net, ThreadContext und Global.asax
Arbeite ich an einem Log4Net Konfiguration, die melden sich alle nicht behandelten Ausnahmen. Ich brauche bestimmte Eigenschaften, basierend auf Benutzer, um Hinzugefügt werden zu jedem log-Eintrag. Ich habe setzen Sie diese erfolgreich in der folgenden Art und Weise in meinem Application_Error event. Hier ist meine komplette global.asax
Imports log4net
Imports log4net.Config
Public Class Global_asax
Inherits System.Web.HttpApplication
'Define a static logger variable
Private Shared log As ILog = LogManager.GetLogger(GetType(Global_asax))
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' Fires when the application is started
ConfigureLogging()
End Sub
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
' Code that runs when an unhandled error occurs
Dim ex As Exception = Server.GetLastError()
ThreadContext.Properties("user") = User.Identity.Name
ThreadContext.Properties("appbrowser") = String.Concat(Request.Browser.Browser, " ", Request.Browser.Version)
If TypeOf ex Is HttpUnhandledException AndAlso ex.InnerException IsNot Nothing Then
ex = ex.InnerException
End If
log.Error(ex)
ThreadContext.Properties.Clear()
End Sub
Private Sub ConfigureLogging()
Dim logFile As String = Server.MapPath("~/Log4Net.config")
log4net.Config.XmlConfigurator.ConfigureAndWatch(New System.IO.FileInfo(logFile))
log4net.GlobalContext.Properties("appname") = System.Reflection.Assembly.GetExecutingAssembly.GetName.Name
End Sub
End Class
Dieser scheint einwandfrei zu funktionieren. Jedoch habe ich einige Fragen, die ich nicht in der Lage bin zu beantworten.
Ist die Art und Weise, dass ich bin das hinzufügen der Benutzer-spezifischen Eigenschaften, über die threadcontext, richtig? Wird dies immer log die richtigen Informationen auch unter Last? Wann würden Sie verwenden threadlogicalcontext? Gibt es einen besseren Weg, dies zu tun?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht sicher, laden, Antrag-bestimmte Werte in
ThreadContext
so. Der Grund dafür ist, dass ASP.NET freigegebene threads auf service-Anfragen. Es macht das sehr oft, in der Tat.Könnten Sie stattdessen verwenden
LogicalThreadContext
jedoch, die einfach speichert die Werte in den Aufruf-Kontext, der für Remoting verwendet.AFAIK gibt es keine HttpContext spezifischen Kontext-Speicher, so dass das, was Sie tun können, ist stattdessen weisen Sie eine "Wert-provider" - Instanz als thread-Kontext, und zur Laufzeit aufrufen .ToString() auf diese Klasse, um den Wert.
Es ist weniger als ideal, aber es funktioniert.
Ben ' s Antwort richtig ist.
Jedoch, wie einige der anderen user, ich war immer noch ein wenig verloren, wie zu Verfahren ist. Diese log4net Rahmen Probleme mit ASP.Net thread Agilität post und vor allem diese Marek Stój Blog - log4net-Kontextuellen Eigenschaften und ASP.NET einen geben etwas mehr Kontext für das problem mit einigen exzellenten code-Beispiele.
Ich sehr empfehlen, Marek Stój der Umsetzung, obwohl die
ThreadContext.Properties["UserName"]
musste ersetzt werden mitThreadContext.Properties["User"]
in meinem Fall.Habe ich ein BeginRequest-Methode, um meine Logger-Klasse, die ich nenne, aus Application_AuthenticateRequest lädt alle relevanten log4net Eigenschaften.
Und die Methode code:
Fand ich, dass ich zu bestehen hatte, in das Request-Objekt statt mit
HttpContext.Current.Request
innerhalb der Methode. Sonst hätte ich Locker den Benutzer und Authentifizierung Informationen. Beachten Sie, dass dieIPNetworking
Klasse ist meine eigene, so müssen Sie Ihre eigene Methode zum Erhalt der client-IP. DieAdaptivePropertyProvider
- Klasse ist direkt von Marek Stój.TheadContext
properties-Auflistung, war aber nicht das ursprüngliche problem, dass wir konnte nicht damit rechnen, dass die Erhebung zu bestehen, richtig? Ich denke, die adaptive Eigenschaft handler zugewiesen werden, muss als eine Eigenschaft im globalen Kontext...