java – log4j的性能

前端之家收集整理的这篇文章主要介绍了java – log4j的性能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个网络应用程序,我想记录一些信息,以帮助我改进和观察应用程序. (我正在使用Tomcat6)

首先我以为我会使用StringBuilders,将日志附加到他们,一个任务会持续到数据库中,就像每2分钟一样.因为我担心开箱即用的记录系统的性能.然后我做了一些测试.特别是log4j.

这是我的代码

Main.java

  1. public static void main(String[] args) {
  2. Thread[] threads = new Thread[LoggerThread.threadsNumber];
  3.  
  4. for(int i = 0; i < LoggerThread.threadsNumber; ++i){
  5. threads[i] = new Thread(new LoggerThread("name - " + i));
  6. }
  7. LoggerThread.startTimestamp = System.currentTimeMillis();
  8.  
  9. for(int i = 0; i < LoggerThread.threadsNumber; ++i){
  10. threads[i].start();
  11. }

LoggerThread.java

  1. public class LoggerThread implements Runnable{
  2. public static int threadsNumber = 10;
  3. public static long startTimestamp;
  4. private static int counter = 0;
  5. private String name;
  6.  
  7. public LoggerThread(String name) {
  8. this.name = name;
  9. }
  10. private Logger log = Logger.getLogger(this.getClass());
  11.  
  12. @Override
  13. public void run() {
  14. for(int i=0; i<10000; ++i){
  15. log.info(name + ": " + i);
  16.  
  17. if(i == 9999){
  18. int c = increaseCounter();
  19.  
  20. if(c == threadsNumber){
  21. System.out.println("Elapsed time: " +
  22. (System.currentTimeMillis() - startTimestamp));
  23. }
  24. }
  25.  
  26. }
  27. }
  28.  
  29. private synchronized int increaseCounter(){
  30. return ++counter;
  31. }
  32.  
  33. }
  34. }

log4j.properties

  1. log4j.logger.main.LoggerThread=debug,f
  2. log4j.appender.f=org.apache.log4j.RollingFileAppender
  3. log4j.appender.f.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.f.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
  5. log4j.appender.f.File=c:/logs/logging.log
  6. log4j.appender.f.MaxFileSize=15000KB
  7. log4j.appender.f.MaxBackupIndex=50

我认为这是log4j的一个很常见的配置.
首先我使用log4j 1.2.14然后我意识到有一个较新的版本,所以我切换到1.2.16

这里是数字(全部以毫秒为单位)

LoggerThread.threadsNumber = 10

  1. 1.2.14: 4235,4267,4328,4282
  2. 1.2.16: 2780,2781,2797,2781

LoggerThread.threadsNumber = 100

  1. 1.2.14: 41312,41014,42251
  2. 1.2.16: 25606,25729,25922

我觉得这很快.不要忘记:在每个循环中,运行方法不仅仅是登录文件,它必须连接字符串(名称“:”i),并检查一个如果测试(i == 9999).

当threadsNumber为10时,有100.000个loggings,如果测试和连接.当它是100,有1.000.000日志,如果测试和连接. (我已经在某处阅读JVM使用StringBuilder的附加连接,而不是简单的连接).

我错过了什么?我做错了吗?我忘了任何可能降低性能的因素吗?
如果这些数字是正确的,我想我不必担心log4j的表现,即使我大量登录,是吗?

我读到:“实际记录的典型成本是大约100到300微秒.”这是对的吗? (log4J manual)

解决方法

是的,Log4J由于其实施者的自觉努力而被认为是快速的.另请参见本07/08末尾的“性能”一节.

猜你在找的Java相关文章