【log4j】日志打印必须使用log.isDebugEnabled()?不使用会消耗系统资源?

之前的一次代码评审,说代码中有问题,对于频发打印的日志,没有使用如下第二中方式,说是有问题,虽然日志没有打印,但是还是会调用demo.toString()方法,占用系统资源

// 方式一:
log.debug("xxxx:{}",demo)
// 方式二:
if(log.isDebugEnabled()){
	log.debug("xxxx:{}",demo)
}

说的我一脸蒙B,我之前也没看过具体源码,也貌似听过这个说法,加之是在很多源码里面看到各个大佬都是使用的这种写法。也没敢吭声。但调整了代码,闲来无事,总觉得吧还是要研究一下知其所以然,不然以后还得蒙B。

查看log4J日志打印源码

public void info(final String format, final Object o) {
	this.logger.logIfEnabled(FQCN, Level.INFO, (org.apache.logging.log4j.Marker)null, format, o);
}

 @Override
    public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
            final Object p0) {
        if (isEnabled(level, marker, message, p0)) {
            logMessage(fqcn, level, marker, message, p0);
        }
    }

不看还好,看了感觉更加的蒙了,这个不是在框架中已经帮我们自行添加了logIfEnabled的判断了吗,如果不满足日志输出的条件,就不会调用logMessage方法进行字符的拼接。兜兜转转终于发现了大家所说的问题了。我们来看看如下两个日志输出的方式:

写法1:
log.info("ffffffffffffff:"+ demo);
写法2:
log.error("bbbbbbbbb:{}", demo);

问题就在这里,如果使用写法1,在进行日志级别的判断前,就会调用demo的string方法对需要打印的日志内容进行拼接组装,然后再进行日志级别的判断。这就出现了之前大家说了,虽然不满足日志输出级别的要求,但是还是调用了对象的toString()方法,占用了系统资源
如果我们使用写法2,则不存在这种问题,因为demo作为一个对象传入被调用的方法中,需要在isEnabled()方法调用后满足条件后,调用logMessage()时才会调用demo的toString()方法进行字符的拼接。

总结:

log日志的打印不是非要使用if(log.isDebugEnabled())的方式,来避免系统资源的占用。我们需要通过规范自己日志输出的格式。不要使用+进行字符串的拼接,而因使用{}占位符的形式,避免资源的占用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用Log4j打印日志的步骤: 1. 在pom.xml文件中添加log4j的依赖,如下: ```xml <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> ``` 2. 在src/main/resources目录下创建log4j.properties文件,配置log4j的相关参数,如下: ```properties # Global logging configuration log4j.rootLogger=INFO, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n # Log file log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=/var/log/myapp.log log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n ``` 上述配置中,rootLogger设置为INFO级别,输出到stdout和log文件中;stdout输出到console,log文件输出到/var/log/myapp.log文件中。 3. 在需要打印日志的类中,使用log4j进行日志打印,如下: ```java import org.apache.log4j.Logger; public class MyService { private static final Logger logger = Logger.getLogger(MyService.class); public void doSomething() { logger.info("something happened"); logger.error("something went wrong"); } } ``` 在上述代码中,使用Logger.getLogger()方法获取Logger对象,然后使用info()和error()方法打印日志。 这就是使用Log4j打印日志的基本步骤,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值