Bob*_*Bob 14 java performance log4j
我正在开发一个网络应用程序,我想记录一些信息,以帮助我改进和观察应用程序.(我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我认为这是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
Run Code Online (Sandbox Code Playgroud)
LoggerThread.threadsNumber = 100
1.2.14: 41312, 41014, 42251
1.2.16: 25606, 25729, 25922
Run Code Online (Sandbox Code Playgroud)
我觉得这很快.不要忘记:在每个循环中,run方法不仅仅是登录文件,还必须连接字符串(name + ": " + i),并检查if测试(i == 9999).
当threadsNumber为10时,有100,000个记录,如果是测试和连接.当它为100时,有1.000.000个记录,如果测试和连接.(我在某处读过JVM使用StringBuilder附加的连接,而不是简单的连接).
我错过了什么?难道我做错了什么?我是否忘记了任何可能降低性能的因素?如果这些数字是正确的,我认为即使我记录很多,我也不必担心log4j的性能,是吗?
我读过:"实际记录的典型成本大约是100到300微秒." 这是对的吗?(log4J手册)
Bri*_*arr 13
如果需要考虑性能,请务必特别注意模式布局文档,并避免使用昂贵的转换字符,如C,F,L和M.这些都需要恶作剧来检索此信息.
代替C,使用c并在创建Logger对象时适当地命名它们.这意味着您无法从父类继承记录器,但重新定义记录器的不便之处值得提高性能.F,L和M没有简单的替换它们的功能,但是在源代码中很容易找到措辞良好的日志消息,因此需要指定确切的方法,文件和行.
最后,避免在日志消息中进行动态字符串连接.当需要使用串联时,请确保将该日志字符串的创建包装在适当的检查器方法中.
private final static Logger LOG = Logger.get(MyClass.class);
...
void someMethod() {
if (LOG.isDebugEnabled()) {
LOG.debug("some really expensive string concatenation: " + someInstanceVariable + " a bunch of other text!");
}
}
Run Code Online (Sandbox Code Playgroud)
isDebugEnabled()始终以恒定时间运行.LOG.debug()本身基本上在开头检查isDebugEnabled(),但是在检查发生之前必须完全构建作为参数传递的字符串,这会在关闭调试级别时造成不必要的延迟.
| 归档时间: |
|
| 查看次数: |
21918 次 |
| 最近记录: |