Log4Net performance
J'ai écrit une application en C# qui s'exécute constamment dans une boucle et plusieurs threads écrire un log4net fichier.
Le problème, c'est que plus l'application est en cours d'exécution, plus le temps qu'il faut pour terminer une boucle. J'ai couru un FOURMIS Performance profiler, et a remarqué que la plupart de ce temps CPU est passé l'enregistrement à l'aide log4.net.
La plus détaillée les journaux de la CPU en plus il utilise et après 30 minutes d'utilisation à 100% de la CPU. Si je désactive la journalisation, le temps d'une boucle reste constante au cours du temps. J'ai eu un coup d'oeil à l'analyseur de Performances Windows et le Disque Physique est la plupart du temps d'INACTIVITÉ.
J'ai essayé de garder ma connexion à un minimum, mais même avec une quantité relativement faible de l'exploitation forestière im encore l'expérience de la question.
Voici un échantillon de mes Log4net.xml fichier de configuration:
<log4net>
<root>
<!-- Levels: OFF, DEBUG, INFO, WARN, ERROR, FATAL-->
<level value="INFO" />
<appender-ref ref="RollingLogFileAppender" />
</root>
<!--Logs to a file-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="c:\\logs\\log-file.txt" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
<rollingStyle value="Composite" />
<datePattern value="yyyyMMdd" />
<maxSizeRollBackups value="20" />
<maximumFileSize value="1MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger %L %M Schdl:[%property{scheduleContext}] Job:[%property{jobContext}] - %message%newline" />
</layout>
</appender>
</log4net>
Je suis en utilisant le même enregistreur de données à partir de chaque objet qui se connecte.
log4net.ILog logger;
log4net.Config.BasicConfigurator.Configure();
logger = log4net.LogManager.GetLogger(typeof(myProject));
Pourquoi serait-il, de plus en plus de CPU le plus qu'il fonctionne?
Tout conseiller sur la façon d'améliorer ce serait appréciée.
ADOnet était à l'origine le même problème
OriginalL'auteur Benjamin Ortuzar | 2010-03-09
Vous devez vous connecter pour publier un commentaire.
Êtes-vous à la configuration de log4net dans tous les objets qui se connecte? On dirait qu'à partir de votre code. La Configuration doit être effectuée une fois par processus, par exemple au démarrage et que vos objets ne devraient avoir à acquérir de l'enregistreur.
Pour chaque classe qui en a besoin pour se connecter j'ai l'habitude de suivre le modèle suivant:
L'aide de ce modèle, vous recevrez automatiquement les bûcherons qui sont hiérarchique en fonction de l'espace de noms et le nom de la classe.
private static readonly ILog log = LogManager.GetLogger(typeof(MyProject));
Vous avez raison, j'étais en train de Configurer() de chaque objet qui se connecte. J'ai ajouté le membre statique pour chaque objet logger. So far So good. Je vais effectuer plus de tests et de mise à jour par la suite.
Merci @Jamie, c'est la façon dont je le fais aussi, sauf si je suis en utilisant l'injection de dépendance.
Après la suppression de l'extra Configurer() je suis en mesure de façon stable journal pendant des heures, je suis aussi capable de journal de beaucoup plus grandes quantités de texte, sans les problèmes de performances que je vivais. Merci pour votre aide.
OriginalL'auteur
Que faites-vous avec ces Propriétés de Contexte?
Schdl:[%property{scheduleContext}] Job:[%property{jobContext}]
Si vous attribuer quelque chose de plus que juste une valeur (ou un objet avec une simple méthode ToString ()), il peut ralentir les performances. Voir la log4net manuel sous Active Les Valeurs De Propriété pour avoir une idée de quoi je parle.Peter Lillevold a une bonne suggestion à propos de la configuration de log4net qu'une seule fois. Vous pouvez également mettre la ligne suivante dans votre AssemblyInfo.cs fichier:
La ligne suivante est facile à couper et à coller dans l'une des classes qui ne journalisation:
Vous pourriez aussi essayer d'allumer log4net interne de l'exploitation forestière pour voir ce qu'il se passe:
J'utilise les propriétés comme ça depuis assez occupé ASP.NET sites (plusieurs threads de journalisation à un FileAppender) sans problèmes. Des valeurs simples, ne devrait pas être le problème.
OriginalL'auteur
(Je n'ai jamais utilisé log4net avant afin de prendre ce que je recommande avec prudence)
Vous pourriez écrire un async proxy de log4Net composant et ouvrez une session sur un thread dédié. Vous n'aurez plus le blocage de votre principal des discussions avec tente d'écrire dans le fichier de log.
Tout ceci est inutile si log4net a déjà un proxy asynchrone.
OriginalL'auteur