当我从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那里得到它。
答案 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));