当前位置: 首页 > 面试题库 >

log4j性能

方安怡
2023-03-14
问题内容

我正在开发一个Web应用程序,我想记录一些信息以帮助我改进和观察该应用程序。(我正在使用Tomcat6)

首先,我以为我会使用StringBuilders,将日志附加到它们之后,任务将像每2分钟将其持久化到数据库中一样。因为我担心现成的日志系统的性能。然后我做了一些测试。特别是与log4j。

这是我的代码:

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.properties

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

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

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

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

我认为这非常快。别忘了:在每个周期中,run方法不仅要登录文件,还必须连接字符串(name + ": " + i),并检查是否为test (i == 9999)

当threadsNumber为10时,有100.000个日志记录,以及测试和串联。如果是100,则有1.000.000日志记录以及测试和连接。(我读过某个地方JVM使用StringBuilder的附加进行串联,而不是简单的串联)。

我错过了什么?难道我做错了什么?我是否忘记了任何可能降低性能的因素?如果这些数字正确的话,我认为即使我大量记录日志,也不必担心log4j的性能,对吗?

我读到:“实际记录的典型成本约为100到300微秒。”
这是正确的吗?(log4J手册)


问题答案:

是的,由于Log4J的实现者有意识的努力,因此它被认为是快速的。另请参阅本Log4J简介末尾的“性能”部分。



 类似资料:
  • 我们正在从v2.5迁移到log4j v 2.6.1(无GC)。想衡量一下这是如何改进我们的应用程序(非基于web的)。 我们在配置中所做的更改: 尽可能使用异步程序。唯一使用的异步附加程序是SMTP。 仅使用支持的模式(%d{dd MMM yyyy HH: mm: ss, SSS})。 没有将log4j2.is.webapp显式设置为false,因为我们没有servlet类,这意味着启用了无垃圾日

  • 我正在使用log4j2.0-rc1和文件,但log4j lib始终使用默认配置(日志级别、appender等)运行它。我还尝试将名称更改为,但什么也没发生。

  • 我有一个java应用程序,它有三个“形上说”的对象。。。1类动物,1类食物,这些与任何遗传或接口无关。。班级经理的最后一个任务是列出动物和食物的清单,经理负责动物园里的动物和食物。。 说到点子上。。。 我正在使用log4j,我需要登录到一个txt文件,如果并且仅当动物列表中的某些内容发生变化。。。(动物死了,出生了,或者什么的…)我需要登录系统。当且仅当食物清单中的某些东西发生变化时。。。(需要新

  • 在Spring Boot Web应用程序中,我在Application.properties中有以下日志记录属性。 事情很顺利--内部Spring Boot和应用程序的调试消息都被记录到logs/spring-boot-logging.log中。但是,即使我添加了具有不同日志级别的log4j2-spring.xml,仍然会选择application.properties的级别。

  • 问题内容: 我经常听到人们说这是最好的做法之一,在记录时避免使用它。 我正在查看代码,以了解他们如何处理此问题,并认为他们正在做类似的事情。 这是方法的代码片段,它采用模式和参数并返回要记录的消息。 我不明白这种实现比使用串联更好。任何对此的见解将非常有帮助。 问题答案: 日志系统中格式字符串的好处是,日志系统可以决定是否必须进行字符串连接。 让我们以这些行为例: 只要此记录器的级别为debug或

  • 这实际上意味着com.abc.MyClass类中的任何日志都将被记录到两个记录器... 我的目标是能够定义第二个记录器(父记录器)来记录直接到达该记录器的任何消息,例如来自com.myclass类的消息,同时只记录通过可加性功能到达并已经记录在后代记录器中的错误级别消息... 如果我将“COM”的记录器设置为错误,我将只看到错误级别的消息,而我愿意看到直接写到这个日志的信息级别的消息... 这可能