Comment puis-je créer un asynchrones wrapper pour log4net?
Par défaut, log4net est synchrone mécanisme de journalisation, et je me demandais si il y avait un moyen d'avoir asynchrone de journalisation avec log4net?
Vous devez vous connecter pour publier un commentaire.
Si vous allez à la log4net site web, vous pouvez trouver quelques exemples, l'un au moins est un asynchrone Appender.
http://logging.apache.org/log4net/release/example-apps.html
Noter que je n'ai pas utilisé l'un de ces exemples, donc je ne peux pas se porter garant pour eux d'une façon ou de l'autre.
Voici un lien vers le réel asynchrone appender de la log4net Exemples de la zone dans leur référentiel de code:
http://svn.apache.org/viewvc/logging/log4net/trunk/examples/net/2.0/Appenders/SampleAppendersApp/cs/src/Appender/AsyncAppender.cs?view=markup
Je l'ai regardé brièvement, et apparemment, il agit comme un wrapper autour d'un ou plusieurs "classiques" Appenders. Sur chaque demande de journalisation (contenant un ou plusieurs LoggingEvent objets), un pool de threads thread est utilisé pour transférer le LoggingEvents à la liste de enveloppés Appenders.
Voulais juste donner mon solution complète pour la référence. Quelques éléments importants, le FixFlags vous permettent de capturer le thread qui est en train de faire l'enregistrement. Le Blocage de la Collection est dans la ReactiveExtensions. Le jist ici, c'est que votre transfert appender poignées Asynchrone des trucs et puis transfère simplement sur le LoggingEvent à une norme Log4Net appender, qui permet de Log4Net faire toutes les choses qu'il est bon. Pas de re-inventer la roue.
Puis, dans votre log4net.xml vous permet de configurer les appenders ainsi
Mise à jour:
Si vous souhaitez utiliser le contexte dans log4net comme "
log4net.ThreadContext.Properties["CustomColumn"]
"Alors vous avez besoin de mettre à jour le code ci-dessus comme
C'est comment je le fais:
De cette façon log4net effectue la journalisation sur un thread séparé, de manière asynchrone...
BTW,
Task
classe est enSystem.Threading.Tasks
espace de noms.Fix
le nom du thread, le message et l'exception, mais aussi les entrées de journal va être conservé hors de vue.ThreadPool
. le débit est aussi terrible.Certaines des idées ici sont inexacts, et résultat non valide/données périmées, de l'ordre de journalisation ou de très mauvaises performances. Par exemple, la accepté de répondre suggère d'utiliser les log4net
AsyncAppender
qui utilise leThreadPool
ce qui entraîne des entrées de commandes qui ne pourrait pas être un problème pour certains, mais je tiens mon journal des événements pour être l'un après l'autre, il peut aussi avoir des terribles de la performance et de mettre trop de pression sur lesThreadPool
aussi il n'a pas de lot les entrées de journal. La réponse suggérée par Jonathan est certainement une bien meilleure solution mais il manque encore des performances optimales.Un bon exemple de la façon dont cela devrait être mis en œuvre peuvent être trouvés ICI et les résultats de l'analyse comparative et l'explication ICI.
Une autre bonne caractéristique de cette solution est qu'il a été mis en œuvre comme un
Forwarder
pas unAppender
permettant à l'utilisateur d'inclure plus d'unAppender
et log pour chacun d'entre eux en même temps.Je suis tombé sur ce problème cette semaine, cependant je n'ai pas envie de continuer à tirer les demandes hors du pool de threads, car cela pourrait finir par mourir de faim le reste de l'application de fils donc je suis venu avec un Système appender qui exécute un thread dédié pour l'ajout, qui est alimenté par l'intermédiaire d'un tampon. Découvrez-le ici: https://github.com/cjbhaines/Log4Net.Async
Log4Net.Async.AsyncForwardingAppender
etLog4Net.Async.ParallelForwardingAppender
et ils ont un très mauvais rendement, veuillez consulter le ma réponse ci-dessous. Vous pouvez exécuter les repères vous suffit d'ajouter votre propre package NuGet pour le projet.https://github.com/cjbhaines/Log4Net.Async
Nous avons asynchrone log4net méthodes disponibles maintenant. Pour les gens qui sont à la recherche de nouvelles réponses.
https://www.nuget.org/packages/Log4Net.Async/