performance log4j
Je suis le développement d'une application web, et j'aimerais enregistrer certaines informations pour m'aider à m'améliorer et d'observer l'application. (Je suis en utilisant Tomcat6)
J'ai d'abord pensé que je pourrais utiliser StringBuilders, ajouter les journaux et à une tâche, de les conserver dans la base de données comme toutes les 2 minutes. Parce que j'étais inquiet à propos de l'out-of-the-box, système d'enregistrement de la performance. Puis j'ai fait quelques test. Surtout avec log4j.
Voici mon code:
Main.java
public static void main(String[] args) {
Thread[] threads = new Thread[LoggerThread.threadsNumber];
for(int i = 0; i < LoggerThread.threadsNumber; ++i){
threads[i] = new Thread(new LoggerThread("name - " + i));
}
LoggerThread.startTimestamp = System.currentTimeMillis();
for(int i = 0; i < LoggerThread.threadsNumber; ++i){
threads[i].start();
}
LoggerThread.java
public class LoggerThread implements Runnable{
public static int threadsNumber = 10;
public static long startTimestamp;
private static int counter = 0;
private String name;
public LoggerThread(String name) {
this.name = name;
}
private Logger log = Logger.getLogger(this.getClass());
@Override
public void run() {
for(int i=0; i<10000; ++i){
log.info(name + ": " + i);
if(i == 9999){
int c = increaseCounter();
if(c == threadsNumber){
System.out.println("Elapsed time: " +
(System.currentTimeMillis() - startTimestamp));
}
}
}
}
private synchronized int increaseCounter(){
return ++counter;
}
}
}
log4j.propriétés
log4j.logger.main.LoggerThread=debug, f
log4j.appender.f=org.apache.log4j.RollingFileAppender
log4j.appender.f.layout=org.apache.log4j.PatternLayout
log4j.appender.f.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.f.File=c:/logs/logging.log
log4j.appender.f.MaxFileSize=15000KB
log4j.appender.f.MaxBackupIndex=50
Je pense que c'est un très commun de la configuration de log4j.
J'ai d'abord utilisé log4j 1.2.14 puis j'ai réalisé qu'il y avait une version plus récente, donc je suis passé à 1.2.16
Voici les chiffres (tous dans millisec)
LoggerThread.threadsNumber = 10
1.2.14: 4235, 4267, 4328, 4282
1.2.16: 2780, 2781, 2797, 2781
LoggerThread.threadsNumber = 100
1.2.14: 41312, 41014, 42251
1.2.16: 25606, 25729, 25922
Je pense que c'est très rapide. N'oubliez pas que: dans chaque cycle de la méthode run pas suffit de vous connecter dans le fichier, il a pour concaténer des chaînes (name + ": " + i)
et de vérifier si un test (i == 9999)
.
Quand threadsNumber est de 10, il y a 100.000 exploitations forestières et si les tests et les concaténations. Quand il est à 100, il y a 1.000.000 de mémorisations et si les tests et les concaténations. (J'ai lu quelque part JVM utilise StringBuilder de l'ajouter pour la concaténation, pas simple concaténation).
Ai-je raté quelque chose? Suis-je en train de faire quelque chose de mal? Ai-je oublié tout facteur qui pourrait diminuer les performances?
Si ces chiffres sont corrects, je pense que je n'ai pas à vous soucier de log4j de la performance, même si j'ai fortement journal, puis-je?
J'ai lu que: "Le coût typique de la journalisation est d'environ 100 à 300 microsecondes." Est-il correct? (log4J manuel)
source d'informationauteur Bob
Vous devez vous connecter pour publier un commentaire.
Oui, Log4J est connu pour être le plus rapide, en raison de l'effort conscient de ses réalisateurs. Voir aussi la section "Performances" à la fin de cette introduction à Log4J.
Si la performance est un problème, assurez-vous d'accorder une attention particulière à la présentation de la répétition de documentation et d'éviter de coûteux de conversion des caractères tels que C, F, L, et M. Ces exiger des manigances pour récupérer cette info.
À la place de C, utilisez c et de manière appropriée le nom de votre Enregistreur d'objets lorsqu'ils sont créés. Cela signifie que vous ne pouvez pas hériter des enregistreurs de classes parentes, mais l'inconvénient de la redéfinition de l'enregistreur de données est la valeur de l'augmentation de la performance. F, L, et M n'ont pas facilement remplacer leurs fonctionnalités, mais bien rédigé les messages de journal doit être vraiment facile à trouver dans votre code source, de sorte que le besoin de préciser la méthode, le fichier et la ligne est diminuée.
Enfin, éviter les dynamiques de concaténation de chaîne dans votre journal des messages. Lorsqu'il est nécessaire d'utiliser la concaténation, entourez-la création de l'enregistrement chaîne de caractères dans le vérificateur de méthode.
La isDebugEnabled() s'exécute toujours en temps constant. JOURNAL.debug() se fait essentiellement une isDebugEnabled() vérifier au début, mais la chaîne passée en paramètre doit être entièrement construit avant cette vérification peut se produire, entraînant un retard inutile lorsque le niveau de debug est éteint.
Exactement. Ne pas optimiser jusqu'à ce que votre profilage résultats indiquent. Il y a des cas, lors de l'enregistrement de la performance est un goulot d'étranglement, mais vous avez besoin d'abord de frapper le cas, alors optimiser pour cela.
le col de la bouteille doit être le disque dur. votre test montre environ 1 MO/s vitesse d'écriture sur disque, ce qui est assez pauvre en fait.
Assurez-vous d'avoir une bonne stratégie de journalisation. Que signifie assurez-vous de définir ce journal et de l'avoir séparé en debug, de trace, d'informations, d'avertissement et d'erreur ainsi que certains autres, si vous en avez besoin. Assurez-vous également de vous donner la possibilité d'allumer et de l'éteindre à adopter performance/débogage en tant que de besoin.
Enregistrement peuvent avoir un impact significatif sur très utilisé site/application, Également la journalisation trop vous donne plus d'informations que vous pouvez trier par. La journalisation est parfois le seul post-incident outil de débogage, vous avez donc, assurez-vous de faire le comte.
Si la performance est vraiment une préoccupation, un coup d'oeil pour slf4j:
http://www.slf4j.org/manual.html
Avec leur espace réservé à l'approche qu'ils sont plus rapides que log4j lors de la désactivation de la journalisation de ces messages, parce que dans log4j la concaténation de chaîne s'effectue de manière indépendante le message est vraiment nécessaire. Slf4j ne remplace l'espace réservé si ce message va être vraiment connecté.
Mais vous pouvez faire quelque chose comme cela dans log4j:
Mais je pense que c'est beaucoup de texte standard-code donc je suis en utilisant slf4j
Il doit être noté que log4j souffre de nombreux verrouillage des douleurs sous la lourde utilisation simultanée.
Plus de détails et de certains solution de contournement dans mon autre réponse:
La Production de fichier de configuration de log4j?
C'est ce que l'Étape de Débogage et les Profileurs sont pour, la journalisation est le dernier bastion de la paresse.