在打印日志时使用方法名作为记录器的参数是不好的做法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在打印日志时使用方法名作为记录器的参数是不好的做法?相关的知识,希望对你有一定的参考价值。

通过在下面的生产中将方法名称定义为字符串,在日志中打印方法名称是一个好主意吗?

private void foo() {
    String methogTag = "foo"; // here defining method name
    int updateCount = // db update operation
    log.info("{} : {} record/s are updated", methogTag, updateCount);

    int deleteCount = // db delete operation
    log.info("{} : {} record/s are deleted", methogTag, deleteCount);
}

日志输出:

2019-04-22 13:24:41.572 ClazzName - foo : 20 record/s are updated
2019-04-22 13:24:41.600 ClazzName - foo : 12 record/s are deleted

我们可以在%M模式布局中使用log4j在日志中打印方法名称。

图案布局:

%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%t] %c{3.}%M - %msg%n

log4j documentation有一个警告

警告生成调用者位置信息非常慢,应该避免,除非执行速度不是问题。

或者,有没有其他方法可以在没有任何内存开销的情况下在记录器中获取方法名称?

谢谢。

答案

在Junit中有一种方法可以获取方法名称,而无需将其存储在任何变量中。

Junit5 TestInfo Class

如果我是正确的,你不是在编写测​​试用例,只是一些逻辑而不是存储方法名称,你可以使用它

Thread.currentThread()
      .getStackTrace()[1]
      .getMethodName();

但是为什么要存储在日志文件中执行的每个方法名称,最好的做法是在发生任何异常时打印堆栈跟踪所以在stackTrace中你不仅可以获得发生异常的方法中的行号而且还可以流程,关于方法的执行方式。

以上是关于在打印日志时使用方法名作为记录器的参数是不好的做法?的主要内容,如果未能解决你的问题,请参考以下文章

【C 语言】数组元素和数组名作为函数参数

数组名作函数参数时,实参与形参变量之间的数据传递是?

Java为参数分配新值,这被认为是一种不好的做法吗?

数组名作为函数的参数属于啥传递为啥

在 azure synapse 存储过程中将表名作为参数传递时将查询结果分配给变量

MyBatis在表名作为参数时遇到的问题