Log4j: est-il synchronisé pour les appels multithread?
Nous sommes en cours d'exécution dans une question intéressante que nous avons constaté en faisant des tests de stress de notre système. Nous sommes à l'aide de log4j (JBOSS) très fortement pour notre enregistrement. Voici un naïf exemple de l'abattage, nous ave
void someFunction()
{
Log.info("entered some function");
...
Log.info("existed some function");
}
Maintenant la chose la plus intéressante que nous avons remarqué, c'est que si nous lancer des threads 100 à l'encontre de cette fonction; la Log.info() appelle bloque par thread.. sens thread 2 est en attente pour thread1 pour terminer l' "Log.info" appel. En cas de Fil 100; il finit par attendre un temps assez long.. Nous sommes à l'aide d'un fichier natif enregistreur.
Est-ce un problème connu?
source d'informationauteur shergill | 2012-02-18
Vous devez vous connecter pour publier un commentaire.
Log4J doit être synchronisée, sinon vous ne seriez voir entrelacés et brouillage des messages de log dans votre fichier. Mais au moins dans Logback seulement appenders sont synchronisés, non pas à l'ensemble de la journalisation des messages (donc le calcul efficace niveau de log, message de log, etc. est multi-thread).
Cependant, même si la synchronisation a été supprimé, I/O serait le goulot d'étranglement car il est intrinsèquement single-threaded. Ainsi envisager de réduire le montant de la consignation, puisque c'est l'accès au fichier qui est lent, pas Log4J.
Vous pourriez également être intéressé par
AsyncAppender
à la file d'attente des messages de journalisation dans un seul thread différent.Oui, log4j utilise multithread syncronyzation. Et pas parfaitement, parfois.
Nous avait subi une dégradation des performances causée par les conflits pour les log4j serrures et même des blocages avec l'utilisation du complexe de la méthode toString ().
Voir https://issues.apache.org/bugzilla/show_bug.cgi?id=24159 et https://issues.apache.org/bugzilla/show_bug.cgi?id=41214#c38par exemple.
Plus de détails dans mon autre réponse:
La Production de fichier de configuration de log4j?
Je suppose que c'est une des raisons de la logback existence et de passer en custom logmanager depuis JBoss 6.
Ce que vous voulez est asynchrone journalisationvoir cet article sur la manière d'y parvenir:
Aussi, pensez à utiliser le droit de niveaux de journal. Le
entered...
etexi(s)ted...
états devraient généralement être connecté àTRACE
niveau, ce qui peut être utile lors du débogage (définissez ensuite configurer log4j pour vous connecter àTRACE
niveau). Dans un environnement de production, vous pourriez raconter log4j pour vous connecter uniquement à partir du niveauINFO
ouDEBUG
évitant ainsi d'inutiles journal des actions.Voir aussi cette question sur la performance de log4j:
D'autres l'ont déjà suggéré des solutions de rechange, j'ai été fouiller dans le code source et en effet il y a un
synchronized
section:D'accord avec les réponses précédentes. L'un des premiers amélioration de la performance des mesures dans n'importe quelle application est de réduire le niveau de log et l'ont vidage de moins en moins les journaux. Les développeurs d'applications doivent faire preuve de diligence dans l'utilisation du droit des niveaux d'enregistrement. L'exploitation forestière a un impact énorme sur les performances en raison de I/O ainsi que la synchronisation surtout lorsque l'enregistreur objets sont statiques et partagé entre les différents threads.