Question

J'utilise log4net dans mon projet et il y a un problème. La fonction principale du programme prend beaucoup de temps et j'utilise la journalisation pour enregistrer des informations à ce sujet. J'utilise FileAppender pour enregistrer le journal dans un fichier.

Mon application se trouve dans le dossier partagé (local) et plusieurs instances de l'application peuvent s'exécuter à partir d'un chemin. Dans ce cas, je ne pouvais enregistrer les informations que depuis le premier programme, les autres instances de mes applications ne pouvaient pas enregistrer les informations car le fichier journal est verrouillé .

Lorsque j'utilise "log4net.Appender.FileAppender + MinimalLock" , des informations sont perdues. Tous les journaux des deux instances ne sont pas enregistrés dans un fichier.

Comment puis-je résoudre ce problème et enregistrer les informations d’instances parallèles? De plus, qu'en est-il de la dégradation des performances lorsque j'utilise " MinimalLock " option?

Merci. J'espère pour votre aide.

Était-ce utile?

La solution

Il suffit d'inclure l'ID de processus de l'application dans le nom du fichier journal. Différentes instances de votre application se connecteront ensuite à différents fichiers. Voici un exemple:

<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value="log_%processid.log" />
  </file>
<!-- ... -->

Autres conseils

Je pense que c'est une situation typique dans laquelle une solution de journalisation centralisée est souhaitable. Au lieu de m'inquiéter des fichiers et de souffrir des goulots d'étranglement liés aux performances, je préférerais que les instructions de journal soient pompées de manière asynchrone vers un service distant qui se chargera de stocker et de gérer les journaux. Consultez cet agrégateur de journaux appelé logFaces . Il a été conçu pour dissocier les applications de la gestion de leurs journaux. Il devrait fonctionner avec l'appender log4net UDP standard et partitionnera vos données de journal par applications, hôtes, threads, etc., tout en vous permettant de créer des fichiers journaux à tout moment, au besoin.

Divulgation : je suis l'auteur de ce produit.

Peut-être vous connectez-vous à différents fichiers de chaque instance? Sinon, vous devrez probablement configurer un processus distinct dédié à la journalisation. Chaque instance de votre programme enverrait ses messages de journal à cet endroit et il s’occuperait de l’ajouter au fichier. Cela pourrait être accompli en utilisant SocketAppender, peut-être. De plus, je trouve qu'il est beaucoup plus facile de gérer la décomposition de la sortie du journal en mandrins à l'aide de RollingFileAppender.

Vous pouvez créer un générateur d'appels personnalisé qui ouvre le fichier à écrire, puis le ferme. Si le fichier est verrouillé, il pourrait faire une pause et réessayer un petit nombre de fois.

Dans l'appender personnalisé, vous pouvez également ouvrir le fichier en mode d'écriture partagée, ce qui autoriserait plusieurs rédacteurs, mais cela n'empêchera pas la fusion d'éléments de lignes de journal.

Si vous n'écrivez pas beaucoup de données, le mécanisme d'ouverture / fermeture, mentionné ci-dessus, est probablement votre meilleure option. Notez que, du fait de l'ouverture et de la fermeture constantes du fichier, l'impact sur les performances peut être sensible si vous enregistrez beaucoup de données.

Mécanisme plus compliqué, mais susceptible de fournir un chemin de journalisation hautes performances: écrivez un service de journalisation qui reçoit les lignes de journal via TCP ou UDP. Le service serait chargé de mettre en mémoire tampon les données et de les écrire sur le disque. Nous avons utilisé cette approche dans le passé (non pas via Log4Net, mais en tant que solution générale) pour améliorer l'efficacité de l'écriture des journaux.

Envisagez de créer différents fichiers journaux pour chaque processus, éventuellement avec des noms de fichiers uniques générés à l'aide d'un horodatage.

Au lieu de MinimalLock, l'utilisation d'InterProcessLock peut réduire les pertes de données en cas de processus multiples accédant à un seul fichier journal.

log4net.Appender.FileAppender+InterProcessLock
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top