说明:本文(”问题和回答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
`access.log.zip`是一个压缩包,里面包含了Nginx服务器生成的访问日志记录,接下来我们将深入探讨Nginx日志的结构、用途及分析方法。 Nginx的默认日志格式(也称为`combined`格式)如下: ``` $remote_addr - $...
`log.js` 可能会提供多种日志级别,如 `debug`、`info`、`warn` 和 `error`,以满足不同场景的需求。这些级别的选择可以帮助你过滤掉不必要的日志信息,使日志更具有针对性。例如,你可以在开发阶段使用 `debug` ...
oracle版本的undolog建表语句。 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地...
if (log.isDebugEnabled()) { log.debug("Debug message"); } if (log.isInfoEnabled()) { log.info("Info message"); } if (log.isWarnEnabled()) { log.warn("Warning message"); } if (log....
《log4j.properties 使用详解》 在Java开发中,日志记录是一项不可或缺的工作,它能够帮助开发者追踪程序运行状态,定位错误,优化性能。而log4j作为一款强大的日志框架,广泛应用于各种Java项目中。本文将详细介绍...
而"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编码: ...
在实际应用中,USBLog.exe是USBLog的可执行文件,用户可以直接运行这个程序来启动USBLog的服务。通常,为了持续监控USB设备,用户需要设置USBLog在系统启动时自动运行,并将日志保存在指定的位置。此外,根据需要,...
if (log.isDebugEnabled()) { log.debug("System property: " + System.getProperty("java.version")); } ``` 使用`isDebugEnabled()`方法判断当前Logger是否开启DEBUG级别,如果开启了,则调用`debug()`方法...
#include"log.h" StdAfx.cpp Logger_mgr* Logger_mgr::pmyself = NULL; logger_dayfile lgdayfile("Logs", "AppLogFile"); logger_base * Logger_mgr::pmylogger = &lgdayfile; // 在项目中需要的地方写日志信息 ...
#include <spdlog/spdlog.h> int main() { auto console = spdlog::stdout_color_mt("console_logger"); console->info("Hello, spdlog!"); return 0; } ``` 在这个例子中,"console_logger" 是日志实例的名称,...
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,还可以通过其他...
总结来说,"eventlog_0.2.12"是跨平台日志管理的利器,通过解压缩并使用其中的工具,无论是Windows还是UNIX/Linux系统的管理员,都能更有效地管理和利用系统日志,提升运维效率,保障系统的稳定性和安全性。
4. **嵌套if**:在一个if语句内部再使用if语句。 5. **switch语句**:作为if...else的替代,处理多个可能的分支。 6. **数组和对象的条件检查**:检查数组中是否存在某个元素,或者对象属性的值满足条件。 7. **函数...