log4j:显示方法名称的最快方法?

时间:2012-04-02 15:19:53

标签: performance methods log4j

在我的日志消息中,我需要插入生成消息的方法的名称。我看过Log4J文档以及“M”和“l”转换字符,它们也有警告,例如“警告生成调用者位置信息非常慢,应该避免,除非执行速度不是问题”。所以我(至少)有两个选择:

  1. 使用这些字符但速度慢了我的代码
  2. 手动将方法名称插入到消息中,例如此log.info("myMethod: message");这样会更快但不那么优雅
  3. 还有其他选项不会减慢我的代码吗?

    谢谢!

3 个答案:

答案 0 :(得分:4)

我不确定您使用的IDE,但如果您使用的是基于Eclipse的IDE,则应该能够使用一些Java模板。这仍将使用方法名称作为字符串,但会节省您的输入时间。

我创建了一整套这样的模板:

  • 模板名称 - li
  • 模式 - logger.info("${cursor}");

warnerrordebug

对于方法的开始和结束,或者只是为每次注销添加方法名称 - 使用类似:

  • 模板名称 - lie
  • 模式 - logger.info("End: ${enclosing_method}${cursor}");

等等。

唯一的限制是你的记录器ref变量总是必须命名为logger。 现在,您只需要键入lie和(如果在创建模板时取消选中自动插入复选框,则可以选择 ctrl + space 时间。)

HTH!

答案 1 :(得分:2)

我大多数时候都使用基本的配置程序,它默认给我方法名称。因此,在技术上添加这一行代码和import语句是获得所需内容的最快方法。

BasicConfigurator.configure();

答案 2 :(得分:0)

如果以编程方式检索此信息的速度非慢,log4j将使用它 - 遗憾的是没有,因为它不是JVM设计为易于运行时环境可用的信息。

这就是为什么大多数日志记录代码仅使用在调试级别检索此信息的模式 - 然后将所有调试调用包装在if(logger.isDebugEnabled()) {条件中,以便仅在程序处于调试模式时检索信息。这种方法使您可以在调试时获得细粒度的运行时信息,而不会影响代码在生产中的性能。

同样重要的是要记住,并非所有代码都是性能密集型的,并且如果您的代码运行并且使用这些模式可以很好地扩展,那么您也可以使用它们。如果您开始遇到性能问题,那么您可以重新考虑。

顺便说一下,Groovy语言(自1.8版本开始)具有AST转换功能,可以自动将记录器(java.util,apache commons,log4j或slf4j flavor)注入到类中,并自动包装所有日志记录调用编译时的条件,以便它们仅在日志记录处于适当级别时运行。这意味着您可以执行上述描述,而无需显式编写条件代码,但当然只有在编写Groovy时才可用。