当前位置: 首页 > 面试题库 >

当我们打开或关闭某些日志位置时,log4j实际在做什么?

司寇书
2023-03-14
问题内容

我们知道可以通过其属性/配置文件来配置log4j以关闭特定位置(Java中的类或包)的日志。我的问题如下:

  1. log4j对这些标志实际做什么?
  2. log4j中的log语句是否仍被调用,但由于该标志而没有被写入文件或控制台?这样仍然会对性能产生影响吗?
  3. 是否像C ++中的#ifdef在编译时生效,然后可以限制性能影响?

谢谢,


问题答案:

是的,日志语句仍将执行。这就是为什么最好先检查日志级别的原因:

if (log.isInfoEnabled()) {
    log.info("My big long info string: " + someMessage);
}

这是为了避免String在日志级别不支持INFO语句时为信息重新分配空间。

它不是什么#ifdef- #ifdef是编译器指令,而Log4J配置在运行时处理。

编辑 :我讨厌由于无知而被贬低,所以这里有一篇文章支持我的回答。

http://surguy.net/articles/removing-log-
messages.xml中

在Log4J中,如果您以DEBUG级别记录消息,并且当前的Appender设置为仅记录INFO或更高级别的消息,则该消息将不会显示。调用log方法本身的性能损失很小-
几纳秒。但是,评估log方法的参数可能需要更长的时间。例如:

logger.debug(“大对象是” + largeObject.toString());

评估largeObject.toString()可能很慢,并且在调用记录器之前对其进行评估,因此即使不使用它,记录器也无法阻止对其进行评估。

编辑2
:来自log4j手册本身(http://logging.apache.org/log4j/1.2/manual.html):

用户应注意以下性能问题。

  1. 关闭日志记录时的日志记录性能。当完全关闭日志记录或仅关闭一组级别的日志记录时,日志请求的成本包括方法调用和整数比较。在233 MHz Pentium II机器上,此成本通常在5至50纳秒范围内。

但是,方法调用涉及参数构造的“隐藏”成本。

例如,对于某些记录器猫来说,

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

产生构造消息参数的成本,即将整数i和entry
[i]都转换为字符串,以及连接中间字符串,而不管是否记录消息。参数构造的成本可能会很高,并且取决于所涉及参数的大小。

为了避免参数构造成本,请写:

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

如果禁用调试,则不会产生参数构造的开销。另一方面,如果记录器已启用调试,则评估该记录器是否已启用的成本将增加一倍:一次在debugEnabled中,一次在调试中。这是微不足道的开销,因为评估记录器大约需要实际记录时间的1%。



 类似资料:
  • 问题内容: 如何配置带有 和的log4j.properties 而不是标准输出? 提高rootlogger到信息是不可接受的,因为我在调试级别有其他软件包。 问题答案: 在文件中,添加行 将记录器的输出定向到附加程序。 还包括线 以防止记录器的输出发送到的附加程序。

  • 问题内容: 我在ORM上还很新。我刚刚开始阅读有关使用Hibernate的Java Persistence API的书籍和文档。 我只是想知道,关闭EntityManagerFactory与jdbc数据库连接关闭类似吗? 我们是否应该在每次持久/更新/删除后关闭它?如果我们不关闭它,数据库连接会保持打开状态吗? 问题答案: 我只是想知道,关闭与jdbc数据库连接关闭类似吗? 这并非完全正确,但关闭

  • 问题内容: 除了一些非常模糊的高级定义(例如“摆脱PermGen问题”(不是,btw))之外,我一生无法找到Java VM标志实际作用的定义。 我查看了Sun / Oracle的站点,甚至选项列表都没有真正说明它的作用。 基于该标志的名称,我猜测CMS垃圾收集器默认情况下不会卸载类,并且此标志将其打开-但我不确定。 问题答案: 对于Java 5-7: 世界上标准的Oracle / Sun VM外观

  • 想改进这个问题吗 通过编辑此文章,添加详细信息并澄清问题。 当计数器小于3并且我等待单击按钮时,我想一直更改循环颜色。当循环是红色时,他需要按“停止”。这是程序: 非常感谢。

  • 我是新手。我对它很着迷,但我不确定它是否适合我的用例。 我想有一个记录器,我可以停止和启动。当它停止时,我想从文件系统中删除日志文件。重新启动日志记录时,应重新创建文件。 logback能做到这一点吗?当日志暂停时,我应该避免在我的类中调用记录器,还是回写可以处理这个问题? 我使用slf4j。记录器当前。在手册中,我看到Appender对象实现了LifeCycle接口,这意味着它们实现了start

  • 我试图在springboot中配置log4j2。我已经从pom.xml.中删除(排除)了登录依赖项,我正在名为log4j2.xml的资源文件夹下使用此xml 这是我的控制器类。 我在这里错过了什么吗?我尝试使用application.properties也使用最新版本的Log4j2.But仍然没有created.When我运行应用程序,我看不到任何日志文件在xml中指定的路径上动态创建。