Log4j日志记录性能

时间:2014-05-28 12:13:27

标签: java performance logging log4j

Log4j模式布局docs警告生成调用者类信息的成本很高,只有在不考虑性能时才应使用。我希望在日志中包含类名以便于分析,并且不希望对性能产生影响。说我有两个选择,

  1. 在每个类中使用getClass()。getName()存储类名,并在日志记录中使用该字符串 String class = getClass().getName(); ... ... logger.debug(class + "log message");

  2. 对类名进行硬编码并将其提供给日志 String class = "com.foo.myclass"; ... ... logger.debug(class + "log message");

  3. 哪个会提供更好的性能,还是有其他方法可以在不影响性能的情况下记录完全限定的类名和方法名。在此先感谢!

    注意:我使用的是log4j 1.2.16

2 个答案:

答案 0 :(得分:4)

生成调用者类名称的代价很高,但是如果您遵循每个类Logger的典型Log4J设计模式,并且Logger名称与类名相同

private static final Logger LOG = Logger.getLogger(ThisClassName.class);

然后在布局模式中简单地使用%c而不是%C就足够了。这使用记录器名称(这是记录器本身的属性)而不是检查调用堆栈,并且不涉及%C%L等模式产生的开销。

如果你确实需要调用者的运行时类而不是文本包含特定日志记录调用的类的静态名称,那么你可以使用每个实例的记录器而不是(或者除了)每个一级

private final Logger instLog = Logger.getLogger(this.getClass());

现在记录器名称将是this的运行时类型,即如果B扩展A并且我们在B的实例上调用方法,则记录器名称将为B,即使对于实际定义的方法也是如此由超类A。

答案 1 :(得分:2)

使用log4j进行日志记录的常用模式如下

public class Foo {

    private static final Logger LOG = Logger.getLogger(Foo.class);

    someMethod(){
         ...
         if(LOG.isDebugEnabled()){
              LOG.debug("log message");
         }
    }
}

classname是记录器名称,因此它(默认情况下)将出现在日志消息中。

最重要的是关于性能:有一个防护措施可以防止在未启用日志级别时计算日志消息的开销。