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