J'utilise log4net dans mon projet et il y a un problème.
La principale fonction du programme prend beaucoup de temps et j'utilise la journalisation pour enregistrer des informations à ce sujet. J'utilise FileAppender strong> pour enregistrer le journal dans le fichier. P>
Mon application est sur le dossier partagé (local) et il pourrait y avoir plusieurs instances de l'application exécutée d'un chemin. Dans ce cas, je ne pouvais que connecter des informations uniquement à partir du premier programme, d'autres instances de mes applications n'ont pas pu enregistrer les informations car le fichier journal est verrouillé p>. P>.
Lorsque j'utilise "log4net.apprend.fileAppender + Minimallock" forte> Option Il existe des cas de perte d'informations. Tous les journaux des deux instances ne sont pas enregistrés dans le fichier. P>
Comment puis-je résoudre ce problème et connecter les informations des instances parallèles? Aussi quoi de la dégradation des performances lorsque j'utilise l'option "Minimallock"? P>
merci. J'espère votre aide. P>
6 Réponses :
Peut-être que vous vous connectez à différents fichiers de chaque instance? Sinon, vous auriez probablement besoin de configurer un processus distinct dédié à la journalisation. Chaque instance de votre programme enverrait ses messages de journal et il s'occuperait de l'ajouter au fichier. Cela pourrait être accompli avec SocketAppender, peut-être. De plus, je trouve que la sortie de journal de rupture dans des mandrins à l'aide de RollingFileAppender est beaucoup plus facile à traiter. p>
Vous pouvez créer un appendeur personnalisé qui ouvre le fichier à écrire, puis la ferme. Si cela a atteint un fichier verrouillé, cela pourrait faire une pause et réessayer un petit nombre de fois. P>
Dans l'appendeur personnalisé, vous pouvez également ouvrir le fichier en mode d'écriture partagé qui permettrait de multiples écrivains, mais cela n'empêchera pas de fusion de morceaux de lignes de journalisation. p>
Si vous n'écrivez pas beaucoup de données, le mécanisme Open / Fermer, indiqué ci-dessus, est probablement votre meilleure option. Remarque, en raison de l'ouverture et de la fermeture constante du fichier, vous pouvez voir un impact de performance notable si vous enregistrez beaucoup de données. P>
Un mécanisme plus compliqué, mais celui qui pourrait fournir un chemin de journalisation de haute performance: écrire un service de journalisation qui reçoit des lignes de journalisation via TCP ou UDP. Le service serait responsable de la mise en mémoire tampon et de l'écrire sur le disque. Nous avons utilisé cette approche dans le passé (pas via Log4net, mais en tant que solution générale) pour améliorer l'efficacité de l'écriture journal. P>
Pourriez-vous fournir un exemple comment créer un appendeur de fichiers personnalisé.
Départ: Karlagius.com/2008/01/ 02 / Écriture-A-Custom-Appender-for-Log4n et
envisager définitivement de créer différents fichiers journaux pour chaque processus, peut-être avec des noms de fichiers uniques générés à l'aide d'un horodatage. P>
Comment puis-je spécifier le nom du logfile à partir d'exécution? Je pensais que cela est disponible uniquement à partir de configuration. déposer?
Vous avez raison, j'ai tiré de la hanche ... Timeestamp traverse, mais la configuration d'un nouveau nom de fichier journal pour un nouveau processus devient délicat. Réponse modifiée, merci.
Je pense que c'est une situation typique lorsque la solution de journalisation centralisée est souhaitable. Au lieu de vous inquiéter des fichiers et de souffrir de goulots d'étranglement de la performance, je préfère pomper des déclarations de journal de manière asynchrone à un service distant qui s'occupera de stocker et de gérer les journaux. Regardez cet agrégateur de journal appelé logfaces , il a été conçu dans le but de découpler des applications de la gestion de leur Journaux. Il devrait fonctionner avec l'appendentif standard Log4net UDP et partitionnera vos données de journal par applications, hôtes, threads, etc. Lorsque vous permettez de créer des fichiers journaux à tout moment quand ils avaient vraiment besoin. p>
Semble Overkill pour une application de bureau simple qui permet de multiples instances.
inclure simplement l'ID de processus de l'application dans le nom du fichier journal. Différentes instances de votre application vous connectez ensuite à différents fichiers. Voici un exemple:
Note aux autres: être très prudent b> à ne pas manquer le type type = "log4net.util.patternstring" code> attribut, ou cela ne fonctionnera pas!
En outre, de Stackoverflow.com/a/15544239/368896 ,
Il n'y aura pas de collisions? Ne serait-il pas préférable d'utiliser le temps que le processus a commencé ainsi que le processus de processus?
Au lieu de Minimallock à l'aide de InterproCessLockLock peut réduire la perte de données en cas de multiples processus Accès à un journal unique.
log4net.Appender.FileAppender+InterProcessLock
Pourriez-vous écrire le journal dans une base de données au lieu d'un fichier?
La principale raison d'utiliser le fichier est que j'ai besoin d'exclure toutes les connexions de base de données.