【发布时间】:2021-11-23 14:50:35
【问题描述】:
出于日志记录的目的,我创建了一个方法 logTitle(),它会为我们的 TestNG 测试打印出调用方法的名称。示例代码如下。
@Test
public void test1() throws Exception {
method1();
}
public static void method1() throws Exception {
Utils.logTitle(2);
}
...
public static void logTitle(Integer level) throws Exception {
// Gets calling method name
String method = Thread.currentThread().getStackTrace()[2].getMethodName();
// This would get current method name
switch (level) {
case 1:
logger.info("=======================================================");
logger.info(method);
logger.info("=======================================================");
break;
case 2:
logger.info("------------------------------------");
logger.info(method);
logger.info("------------------------------------");
break;
case 3:
logger.info("---------------------");
logger.info(method);
logger.info("---------------------");
break;
case 4:
logger.info("--------- " + method + " ------------");
break;
default:
logger.info(method);
}
}
问题是我在两台不同的机器上得到不同的 logTitle() 结果。
每个人的笔记本电脑都正确返回:
2016-06-20 14:22:06 INFO - ------------------------------------
2016-06-20 14:22:06 INFO - method1
2016-06-20 14:22:06 INFO - ------------------------------------
我们的开发 unix 框返回不同:
2016-06-20 14:42:26 INFO - ------------------------------------
2016-06-20 14:42:26 INFO - logTitle
2016-06-20 14:42:26 INFO - ------------------------------------
这在其他所有人的笔记本电脑上都能正常工作,但在开发 unix 机器上却不行。我认为 dev unix 机器使用的是 IBM 的 Java 版本,而其他人都在使用 Oracle 的 Java 版本,但不确定这是否是罪魁祸首。
有什么想法吗?
【问题讨论】:
-
可能有一些方法method1的内联?
-
打印整个堆栈跟踪(不仅仅是第三个元素的方法名称),看看有什么区别?
-
我怀疑this answer 和它的cmets 会帮助你。
-
This answer 也可以提供帮助。显然它在不同版本的 Oracle JVM 之间甚至不一致,所以我不希望它在完全不同的 JVM 上是可靠的。