4

我正在尝试使用 apache commonn logging 和 log4j.xml 文件作为配置文件来实现记录器。

所以在实际的java代码中我写日志为

我正在使用 appache 通用日志记录

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

我正在记录信息,例如 . 我正在为每个类创建一个日志实例

 private static Log    logger  = LogFactory.getLog( MyClass.class );
    private static final String      name   ="SAM";
    logger.info("name= "+name);
  1. 所以现在我的问题是实现这样的记录器会产生性能问题吗?

  2. 是否有必要检查日志

    if ( log.isInfoEnabled( ) ) 
     {
      log.info( "Info message" );
      }
    

混淆主要是因为他们在 Apache 通用日志记录中提到了这样做,而在 log4j 中他们提到这是不必要的。

每次我们在文件中写入日志时?

-山姆

4

3 回答 3

2
  1. 是和否,日志记录总是会降低您的性能,但有些功能比其他功能更昂贵,例如获取调用类/方法名称使用反射并且非常慢。但是,如果您在调用日志记录函数中没有昂贵的语句,则正常的 logfuntion 不会那么昂贵(每次检查 log-Level 之前都会对其进行评估。在这种情况下,您可以使用.isLevelEnabled检查来防止评估)。此外,记录到控制台的输出时间也比记录到文件的时间长。您可以通过谷歌搜索和 log4j 的常见问题解答/手册找到更多信息。

  2. 不必在记录之前检查日志级别。这是在日志函数本身内完成的。因此,通用日志方法中的每个级别或级别参数都有不同的方法。

于 2012-12-28T17:12:58.233 回答
2

日志记录的一个很大的潜在性能问题通常是如果您将某些内容传递到 log 方法中,转换为字符串的成本非常高。这就是为什么你有类似的方法isInfoEnabled(),这样代码就可以避免从参数创建消息字符串(否则info()方法内的检查为时已晚,转换已经完成)。如果传递给日志方法的对象是字符串或者不是很复杂,那么这些is*Enabled()方法就没有那么有用了。

SLF4J 值得一试。它不依赖于类加载器技巧(这是为什么公共日志受到谴责的一个重要部分),并且它具有创建日志消息的不同方式,该方式在创建消息字符串时会延迟,以便启用的检查可以在记录方法。

于 2012-12-28T17:29:29.307 回答
1

有更好的方法来完成这一切。您可以获得真正出色的性能,而无需添加ifDebugEnabled, 等方法的混乱。查看类似Logback(或 SLF4J)的东西。这是关于你想要什么样的 API 的优秀文档。请注意,Log4J 和 Commons-Logging 没有这样的 API。使用参数化日志记录

于 2012-12-28T17:35:24.320 回答