Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';这个日志记录语句有什么问题?_Java_Logging_Slf4j - Fatal编程技术网

Java 什么';这个日志记录语句有什么问题?

Java 什么';这个日志记录语句有什么问题?,java,logging,slf4j,Java,Logging,Slf4j,我最近在现有应用程序中偶然发现了以下几行日志代码。这个代码在很多方面对我来说都是完全错误的 Method method = ...;// passed in as parameter //... String className = method.getDeclaringClass().getName(); String methodName = method.getName(); long id = Thread.currentThread().getId(); String name = T

我最近在现有应用程序中偶然发现了以下几行日志代码。这个代码在很多方面对我来说都是完全错误的

Method method = ...;// passed in as parameter
//...
String className = method.getDeclaringClass().getName();
String methodName = method.getName();
long id = Thread.currentThread().getId();
String name = Thread.currentThread().getName();
String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name);
LOGGER.debug("xxxxxxxx {}", msg);
我想知道

  • 这个代码有什么错
  • 对绩效影响最大的是什么
  • 编写这样的日志语句的最佳方式是什么

(注意:如
{}
所示,它是一个SLF4J记录器,
xxxxxxxx
是一个唯一的字符串,用于标识代码库中的这个特殊日志语句)

日志记录是应用程序中的一个交叉问题。
因此,对于一般情况,我使用拦截器/方面模式来实现它。

String className = method.getDeclaringClass().getName();
String methodName = method.getName();
long id = Thread.currentThread().getId();
String name = Thread.currentThread().getName();
String msg = String.format("some text, for: %s %s in thread %d %s",
              className, methodName, id, name);
在当前记录器的有效级别之前进行所有这些计算而不进行检查是没有意义的,因为即使未写入日志,也会应用它。
此外,如果需要并在appender模式中指定,API记录器可以检索所有这些信息

此外,这也是无效的:

String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name);
LOGGER.debug("xxxxxxxx {}", msg);
它还会在检查级别之前格式化字符串。

对于实际代码,这更好:

if (LOGGER.isDebugEnabled()){
   String className = method.getDeclaringClass().getName();
   String methodName = method.getName();
   long id = Thread.currentThread().getId();
   String name = Thread.currentThread().getName();
   String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name);
   LOGGER.debug("xxxxxxxx {}", msg);
 }
但更健壮的解决方案是使用appender模式用线程id、方法等修饰日志信息


最后,如果当前级别的检查(此处:
if(LOGGER.isDebugEnabled()){
)没有包含日志处理,则通常是这样,例如:

String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name);
LOGGER.debug("xxxxxxxx {}", msg);
更有效的方法是使用log方法,该方法采用var args作为其设计目的,而不是在您的示例中使用,因为它违背了它的目的

这样,如果有效记录器级别不匹配,则可以节省计算:

LOGGER.debug("some text, for: {} {} in thread {} {}", className, methodName, id, name);

“这段代码在很多方面对我来说都是完全错误的”-在哪些方面?反射速度很慢,所以这可能是一个性能上的问题。如果使用适当的日志模式而不是重新发明轮子,可能会更容易、更有效。。。