为java应用程序实现日志记录器



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

所以在实际的java代码中,我将log写成

我正在使用apache通用日志

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

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

 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中他们提到这是不必要的。

每次写入日志文件时?

感觉

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

  2. 不需要在日志记录前检查Log-Level。这是在log函数本身内完成的。因此,对于每个Level或通用log-Method中的Level- argument都有不同的方法。

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

SLF4J值得一试。它不依赖于类加载器的技巧(这是为什么common -logging被谴责的一个重要部分),并且它有一种不同的方式来创建日志消息,当消息字符串被创建时,它会延迟,以便启用的检查可以在日志方法中进行。

有一种更好的方法可以做到这一切。您可以获得非常好的性能,而不必添加ifDebugEnabled等方法的混乱。看看Logback(或SLF4J)之类的东西。这里有一个很好的文档,告诉你需要什么样的API。注意,Log4J和Commons-Logging没有这样的API。使用参数化日志