LogRecord.getSourceMethodName()返回lambda $ 0

时间:2016-02-25 13:16:13

标签: java lambda java-8 java.util.logging

当我从lambda调用java.util.logging.Logger.log(Level, String)时,java.util.logging.LogRecord.getSourceMethodName()方法会在Formatter处返回lambda $ 0。

例如:

public void doStuff() {
    List<String> names = new ArrayList<>();
    names.add("John");
    names.add("Paul");
    names.add("George");
    names.add("Ringo");

    names.forEach((beatle) -> Logger.getLogger("myLog").log(Level.SEVERE, beatle));
}

如何获取方法名称(doStuff)&#39; lambda $ 0&#39;?

PS:我不想从StackTrace那里得到它。

1 个答案:

答案 0 :(得分:2)

来自documentation of the Logger class

  

对于不采用显式源名称和方法名称的方法,Logging框架将尽最大努力确定调用日志记录方法的类和方法。但是,重要的是要意识到这种自动推断的信息可能只是近似的(甚至可能是非常错误的!)。允许虚拟机在JITing时进行广泛的优化,并且可以完全删除堆栈帧,从而无法可靠地定位调用类和方法。

因此,解决问题的方法是指定类名和方法名:

Logger logger = Logger.getLogger("myLog");
names.forEach(beatle -> logger.log(Level.SEVERE,
    getClass().getName(), "doStuff", beatle));