For example, for some logger cat, writing,

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));

incurs the cost of constructing the message parameter, i.e. converting both integer i and entry[i] to a String, and concatenating intermediate strings, regardless of whether the message will be logged or not. This cost of parameter construction can be quite high and it depends on the size of the parameters involved.

To avoid the parameter construction cost write:

if(logger.isDebugEnabled() { logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); }

This will not incur the cost of parameter construction if debugging is disabled. On the other hand, if the logger is debug-enabled, it will incur twice the cost of evaluating whether the logger is enabled or not: once in debugEnabled and once in debug. This is an insignificant overhead because evaluating a logger takes about 1% of the time it takes to actually log.

In log4j, logging requests are made to instances of the Logger class. Logger is a class and not an interface. This measurably reduces the cost of method invocation at the cost of some flexibility.

Certain users resort to preprocessing or compile-time techniques to compile out all log statements. This leads to perfect performance efficiency with respect to logging. However, since the resulting application binary does not contain any log statements, logging cannot be turned on for that binary. In my opinion this is a disproportionate price to pay in exchange for a small performance gain.

2.简单来说,就是用isDebugEnabled方法判断下是能提升性能的。(From: http://blog.sina.com.cn/s/blog_616b57310100f36s.html )

if (logger.isInfoEnabled()) {         logger.info("User " + userId + " is using app " + appId);     }
为什么要加上logger.isInfoEnabled()?原因有两点。

1).直接使用logger.info("User " + userId + " is using app " + appId)来输出log,也能够达到log级别为INFO或在INFO以下时才输出:("User " + userId + " is using app " + appId),因为logger.info方法内部有判断输出级别的代码。但是在进入logger.info函数之前,("User " + userId + " is using app " + appId) 这个表达式已经通过运算拼接成了一个字符串;而如果事先使用 if (logger.isInfoEnabled())进行判断,那么当log级别在INFO以上时,就能省去上述的字符串操作,在高并发和复杂log信息拼接的情况下,使用这种标准的方法输出log能够省去不小的系统开销。另外,如果构造log信息的过程需要大量字符串操作,建议使用StringBuilder来完成字符串拼接。

2).ERROR及其以上级别的log信息是一定会被输出的,所以只有logger.isDebugEnabled和logger.isInfoEnabled方法,而没有logger.isErrorEnabled方法。

,才会拿来仔细研究的。记得当时学的log4j,也就简单了解点,

很多东西当真都是要用到的时候1.看下apache的官方的document,在Performance下那块(From: http://logging.apache.org/log4j/1.2/manual.html)For example, for some logger cat, writing,logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));incurs the cost of ...
为什么要 使用 isDebug Enab led () 之前在系统的代码中发现有时候会在打印日志的时候先进行一次判断,如下: if ( LOGG ER .isDebug Enab led ()) { LOGG ER .debug("Search paramet er s: " + searchParams); 我们 使用 的是 Log4j 2框架,框架自身提供了类似的许多api,比如 isE rror Enab led (...
一、 log4j 配置文件详解 1、定义配置文件 Log4j 支持两种配置文件格式,一种是XML格式的文件,一种是 Java 特性文件 log4j .prop er ties(键=值)。下面将介绍 使用 log4j .prop er ties文件作为配置文件的方法: ①、配置根 Logg er Logg er 负责处理日志记录的大部分操作。 其语法为: log4j .root Logg e... com.xx.demo.controll er .xxxControll er : debug 2、可以 使用 postman之类的工具,调用服务对应的接口修改日志级别( 使用 了actuator的前提下) 请求地址:服务地址/actuator/ logg er s/包名 POST请求 "configuredLevel":" er ror" # 对应的日志级别 debug/info/e...
最近在对项目的日志进行优化,主要是如何减少不必要的日志输出,如何优化日志输出的性能, 以及当前code中,一些不规范的日志输出代码的优化。基于此,对 java 日志进行了一个系统的梳理。 今天这里,主要分享一个点,干货!具体的理论就不再重复搬运了,大家可以自行搜索脑补。 Spring Cloud + Slf4j + Log back 架构打印日志的正确姿势 import lombok.ext...
简单来说,两者主要是为了提升性能。 直接 使用 logg er .info(...)来输出 log ,在进入 log .info函数之产有,括号内的表达式已经通过运算拼接成了一个字符串,而如果事先 使用 if( logg er .isInfo Enab led ())进行断断,那么当 log 级别为debug及以上时,就省去上述的字符串操作,在高并发和复杂的 log 信息拼接的情况下, 使用 这种标准的方法输出 log 能够省去不小的开销。 log 4net 无法输出日志,跟踪发现 IsE rror Enab led 等,都是Flase。 因为这是个半路接手的项目,写法和我之前的习惯不一样,所以也没看出问题出在哪里。 代码如下:         private static readonly I Log Log = Log Manag er .Get Logg er (MethodBase.GetCurrentMethod().Declari...
Log 4net——.NET开源日志记录组件的基本应用【分类库 使用 log 4net是.Net下一个非常好用的开源日志记录组件。 log 4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。 该博文主要介绍如何将其分类库 使用 ,日后直接套用。 1、先安装 log 4net组件,直接在NuGet下载依赖包即可 2、在类库文件AssemblyInfo.cs最下方加...
logg er .info是一个常用的日志记录函数,它可以用来记录程序运行时的信息,比如变量的值、函数的执行情况等等。在 使用 logg er .info时,需要先创建一个 logg er 对象,然后调用该对象的info方法来记录信息。通常情况下,我们会将日志信息输出到文件中,以便后续的查看和分析。以下是一个 使用 logg er .info的示例代码: import logg ing logg ing.basicConfig(filename='example. log ', level= logg ing.INFO) logg er = logg ing.get Logg er (__name__) def foo(): x = 1 y = 2 logg er .info('x = %d, y = %d', x, y) foo() 在上面的代码中,我们首先 使用 basicConfig函数来配置日志记录器,将日志输出到example. log 文件中,并设置日志级别为INFO。然后创建一个名为 logg er 的日志对象, 使用 该对象的info方法记录了变量x和y的值。最后调用foo函数,即可将日志信息记录到文件中。