为java应用程序实现logger

时间:2012-12-21 06:48:45

标签: java logging log4j apache-commons

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

所以在实际的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" );
      }
    
  3. 混淆主要是因为在他们提到的Apache常见日志记录中这样做而在log4j中他们提到它是不必要的。

    每次我们写入文件登录?

    萨姆

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

有一种更好的方法可以做到这一切。无需添加ifDebugEnabled等方法的混乱,您就可以获得非常出色的性能。查看类似Logback(或SLF4J)的内容。这是关于您想要什么样的API的优秀文档。请注意,Log4J和Commons-Logging没有这样的API。使用Parameterized Logging