我在我的应用程序中使用Log4J进行日志记录.以前我使用调试调用如:
选项1:
logger.debug("some debug text");
Run Code Online (Sandbox Code Playgroud)
但有些链接表明最好先检查一下isDebugEnabled(),例如:
选项2:
boolean debugEnabled = logger.isDebugEnabled();
if (debugEnabled) {
logger.debug("some debug text");
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是" 选项2能否以任何方式提高性能? ".
因为在任何情况下Log4J框架都对debugEnabled进行相同的检查.对于选项2,如果我们在单个方法或类中使用多个调试语句可能是有益的,其中框架不需要isDebugEnabled()多次调用方法(在每次调用时); 在这种情况下,它只调用isDebugEnabled()一次方法,如果Log4J配置为调试级别,那么实际上它调用isDebugEnabled()方法两次:
我不认为如果我们logger.debug()在方法或类中编写多个语句并debug()根据选项1 调用方法,那么与选项2相比,它是Log4J框架的开销.因为它isDebugEnabled()是一个非常小的方法(就代码而言),它可能是内联的好人选.
我正在开发一个网络应用程序,我想记录一些信息,以帮助我改进和观察应用程序.(我正在使用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 …Run Code Online (Sandbox Code Playgroud)