说明:本文(”问题和回答1和回答2“部分)转载自:http://huangxx.iteye.com/blog/190693
”分析和我的回答“部分是我自己的分析,故将本文改成原创(更确切的类型应该是转载+原创)。
问题:
在使用log4j,common-log这样的log框架时,发现很多代码中这样写
if (log.isDebugEnabled
()) {
log.debug( "xxxx ");
}
我很奇怪,为什么要与log.isDebugEnabled
()?既然log.debug()在没有指定输出级别为DEBUG时不会有输出,为什么还要在前面加一个isDebugEnabled
()的判断?
回答1:
1. 为了效率,如果上述那个代码那么简单是没有必要的
2.
3. 但是如果这样
4. if (log.isDebugEnabled()) {
5. log.debug(buildFullString());
6. }
7.
8. 如果这个buildFullString效率不太高,那么如果直接写log.debug(buildFullString());的话
9.
10. 虽然它不会打印语句,但是buildFullString还是被执行了,这样就白费了功夫
11.
12. 所以加上isDebugEnabled就可以避免执行buildFullString了
13.
14. 这个方法一般用在认为buildFullString这个函数效率不太高的情况下
回答2:
1. 加不加if,效果相同,但是效率不同
2.
3. 在你的例子里,debug的参数就是一个string,所以没有太本质的差别
4.
5. 但是假如log.debug( "map= " + map) 的话,在调用debug之前,必然需要调用map.toString(),而这个操作可能导致更多的大量字符串操作,最后,才能得到这个辛辛苦苦拼接出来的结果,作为参数传入debug(),结果,这个参数却不需要(一般在log方法入口就判断输出level)。
20090409说明:我下载了log4j的源代码,apache-log4j-1.2.15.zip。
org.apache.log4j包中的Category类,debug方法定义如下:
public void debug(Object message) {
if(repository.isDisabled(Level.DEBUG_INT))
return;
if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
forcedLog(FQCN, Level.DEBUG, message, null);
}
}
分析:可以看出,在debug方法内部,也先进行了log级别的判断。
显然,在使用这个debug方法之前,首先要将参数message构筑好。这也是先使用isDebugEnabled
方法进行判断的目的。
(20090414追加)我的回答:在前面加不加这句if判断,结果是一样的,但是效率可能有所差别:
当输出级别是debug,即需要进行日志信息输出时,加不加这句if判断,在效率上几乎没有差别;
当输出级别高于debug,即不需要进行日志信息输出时:
①假如debug方法中的参数比较简单时(比如直接就是写好的字符串),加不加这句if判断,在效率上也几乎没有什么差别;
②假如debug方法中的参数比较复杂时(比如还要使用别的函数进行计算、或者还要进行字符串的拼接等等),在前面就加上这句if判断,会让效率提高(否则,开始大动干戈做了很多事情(比如字符串的拼接),后来才发现不需要进行输出日志信息)。
-》上面的这段分情况讨论的描述,可以作为回答这个问题的“标准”答案。(20090507追加)
分享到:
相关推荐
本文将详细介绍`Log.isLoggable`的正确使用姿势以及它在实际开发中的应用场景。 首先,我们来看`Log.isLoggable`的基本用法。它的原型是: ```java public static boolean isLoggable(String tag, int level) ``` ...
本文将详细解析Android中的Log使用,特别是Log.v, Log.d, Log.i, Log.w, 和 Log.e这五个主要的日志级别。 首先,我们来了解每个级别的具体含义和用途: 1. **Log.v()** - 代表VERBOSE级别,输出最详细的信息,通常...
Android源码,/platform/system/core/include/cutils/log.h
`log.js` 可能会提供多种日志级别,如 `debug`、`info`、`warn` 和 `error`,以满足不同场景的需求。这些级别的选择可以帮助你过滤掉不必要的日志信息,使日志更具有针对性。例如,你可以在开发阶段使用 `debug` ...
- **嵌套使用**:`if` 语句可以嵌套在其他 `if` 语句中,形成多层条件判断,以实现更复杂的逻辑。 2. **跳转语句** - **break**:在循环或switch结构中,`break` 语句用于立即退出当前循环或switch,执行后续的...
if (log.isDebugEnabled()) { log.debug("Debug message"); } if (log.isInfoEnabled()) { log.info("Info message"); } if (log.isWarnEnabled()) { log.warn("Warning message"); } if (log....
Android系统自带的Log工具提供了基本的日志输出功能,包括`Log.v()`(verbose)、`Log.d()`(debug)、`Log.i()`(info)、`Log.w()`(warn)、`Log.e()`(error)等方法,但它们默认并不显示行号。在复杂项目中,...
《log4j.properties 使用详解》 在Java开发中,日志记录是一项不可或缺的工作,它能够帮助开发者追踪程序运行状态,定位错误,优化性能。而log4j作为一款强大的日志框架,广泛应用于各种Java项目中。本文将详细介绍...
在实际应用中,USBLog.exe是USBLog的可执行文件,用户可以直接运行这个程序来启动USBLog的服务。通常,为了持续监控USB设备,用户需要设置USBLog在系统启动时自动运行,并将日志保存在指定的位置。此外,根据需要,...
而"nf_log.h"则是对应的头文件,包含了相关的函数声明和数据结构定义,供其他模块调用和使用。这两个文件共同构成了内核网络日志子系统的实现。 3. **LOG目标模块(LOG Target Modules)** “Real LOG target ...
精简版的`log4j.properties`仅包含必要的配置,适用于简单场景。比如: - 只有一个输出到控制台的Appender,没有日志文件。 - 全局日志级别设置为INFO或ERROR,不记录DEBUG级别的日志。 - 日志格式简化,只包含日期...
`FD_log.c`可能包含函数的实现,而`FD_log.h`则可能包含了相关的函数声明和结构定义,使得其他源文件可以方便地使用这个日志系统。 下面是一个基本的日志记录类的概览,它支持多字节字符集(MBCS)和Unicode编码: ...
1. 在应用程序中使用 Log4j,需要将 Log4j 库文件(log4j-*.jar)添加到 CLASSPATH 变量中。 2. 新建一个配置文件 log4j.properties,放于 bin 文件下。 二、log4j.properties 配置文件 log4j.properties 配置文件...
if (log.isDebugEnabled()) { log.debug("System property: " + System.getProperty("java.version")); } ``` 使用`isDebugEnabled()`方法判断当前Logger是否开启DEBUG级别,如果开启了,则调用`debug()`方法...
(进阶)AWS DeepRacer分析log-002 log 原始数据 可与 我的博客 https://rambo.blog.csdn.net/article/details/120682010 配套使用更佳
javax.servlet.jar and org.apache.commons.logging.Log.jar javax.servlet.jar and org.apache.commons.logging.Log.jar
if (log.isDebugEnabled()) { log.debug("System ..."); } } } ``` #### 五、Log4j的高级特性 Log4j除了基本的日志记录功能外,还支持许多高级特性,比如: - **多语言接口**:不仅支持Java,还可以通过其他...
log.Debug("这是调试信息"); log.Info("这是信息"); log.Warn("这是警告"); log.Error("这是错误"); log.Fatal("这是致命错误"); } ``` 这段代码首先通过LogManager获取一个Logger实例,然后调用不同级别的Log...