【发布时间】:2010-06-16 12:20:04
【问题描述】:
我正在开发一个网络应用程序,我想记录一些信息来帮助我改进和观察该应用程序。 (我用的是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),并检查 if 测试 (i == 9999)。
当threadsNumber 为10 时,有100.000 个日志记录以及if 测试和连接。当它为 100 时,有 1.000.000 个日志记录以及 if 测试和连接。 (我在某处读过 JVM 使用 StringBuilder 的 append 进行连接,而不是简单的连接)。
我错过了什么吗?难道我做错了什么?我是否忘记了任何可能降低性能的因素? 如果这些数字是正确的,我认为即使我大量登录也不必担心 log4j 的性能,不是吗?
我读到过:“实际记录的典型成本约为 100 到 300 微秒。”这是正确的吗? (log4J manual)
【问题讨论】:
标签: java performance log4j