Ich arbeite an einer Log4Net-Konfiguration, die alle nicht behandelten Ausnahmen protokolliert. Ich brauche bestimmte Eigenschaften, basierend auf Benutzer, zu jedem Protokolleintrag hinzugefügt werden. Ich habe dies erfolgreich in der folgenden Weise in meinem Application_Error-Ereignis eingerichtet. Hier ist meine komplette global.asaxLog4Net, ThreadContext und 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
Dies scheint zu funktionieren. Ich habe jedoch einige Fragen, die ich nicht beantworten kann.
Ist der Weg, dass ich die benutzerspezifischen Eigenschaften über den threadcontext hinzufügen, korrekt? Wird dies immer die richtigen Informationen protokollieren, auch unter Last? Wann würden Sie threadlogicalcontext verwenden? Gibt es einen besseren Weg, dies zu tun?
Dank
Seien Sie vorsichtig, wenn Sie eine parallele Codierung verwenden, da HttpContext.Current möglicherweise in alle Worker-Threads kopiert werden muss, wenn sie zum Protokoll hinzugefügt werden. –
Wo in global.asax.cs würden Sie den Aufruf auf HttpContextUserProvider setzen? – Rory
ASP.Net verfügt über einen kontextspezifischen Speicher. Siehe hier: http://msdn.microsoft.com/en-us/library/system.web.httpcontext.items.aspx – MatteoSp