记录最佳实践 - 在目标方法的开头记录方法调用或记录?

Pio*_*ler 8 language-agnostic logging coding-style

当我们记录时:在函数调用之前(例子A)或在目标方法开始之前(例子B)?

请注意,此问题与准确的记录器函数调用位置有关,而不是一般的最佳日志记录实践.

解答A:登录函数调用:

function someProcess() {
    log.info("Reading data");
    readDataFromIO();
    log.info("Outputing data");
    outputDataToScreen();
}

// ... other module:

function readDataFromIO() {
    ...
}

function outputDataToScreen() {
    ... 
}
Run Code Online (Sandbox Code Playgroud)

解决方案B:登录方法的开头

function someProcess() {
    readDataFromIO();
    outputDataToScreen();
}

// ... other module:

function readDataFromIO() {
    log.info("Reading data");
    ...
}

function outputDataToScreen() {
    log.info("Outputing data");
    ... 
}
Run Code Online (Sandbox Code Playgroud)

在解决方案A中,您可以在效率问题上升时自定义消息或记录日志,但是如果日志消息看起来相同,您可以忘记记录并且有大量重复的代码.在解决方案B中,没有忘记日志记录和没有代码重复的风险,但是你不能100%关闭日志记录逻辑,如果在方法调用中出现错误,你就会遇到麻烦,比如空指针异常.这是最好的做法?

Old*_*Pro 8

当然,最佳做法是将记录放在您需要的地方.:-)但在你的例子中,最好的做法是根本不使用日志记录.

尽管TRACE在许多日志记录框架中存在级别,但日志记录通常不适合跟踪程序流(这是您尝试执行的操作).日志记录的最佳用途是记录数据流经系统,引起的问题尤为数据.

记录数据时,应将数据记录在可以最好地解释的上下文中.那通常是

  • 在函数的开头(记录输入),
  • 在函数结束时(记录输出或定时),或
  • 检测到错误的地方.

要找出发生致命错误的位置,您应该有一个错误处理程序,该错误处理程序会通知致命错误并记录显示错误发生位置的堆栈跟踪.(最现代的语言默认执行此操作,而较旧的语言现在可以启用此方法.)您不应尝试记录执行路径以尝试本地化问题.

  • 如果不使用日志记录,还有其他方法可以跟踪执行路径吗? (2认同)
  • 为什么您认为日志记录的最佳用途是记录流经系统的数据?在这一点上,这听起来只是个人喜好。 (2认同)

Adi*_*tya 5

我在这里提供的实践并非来自任何来源,而是我使用的方法,并且在多年的使用中发现最有效。

登录方式

方法是具有特定目的的代码块。将每个方法的日志记录保留在方法本身中。这样,当您从其他地方重新使用该方法时,不必在每个地方都添加记录器。如果该方法碰巧是从许多地方调用的util,请降低记录器级别或该前缀的记录器优先级。

使用MDC /请求ID /线程名称

要跟踪请求或呼叫源的流程,请在记录器中设置参数或使用线程名称,以便所有后续日志都具有该标记,并遵循该标记的日志。通常,最好在收到请求后立即在记录器中设置标签。

为了避免重复记录

捕获异常并在代码中的特定逻辑阶段记录日志。例如-在具有以下堆栈Action / JSP / Web服务等的Web应用程序中->模块调用->帮助程序模块-> Util->库。

在这里,我将以模块调用级别登录(对应于您代码中的someProcess())。任何内部调用将是置于方法内部的DEBUG级别调用。或者,您可以使用更高的日志过滤器来记录帮助程序模块等。

日志记录是一个非常主观的事情,它与决定一种方法并在任何地方坚持下去有很大关系。没有一种适合所有解决方案的尺寸。您需要通过逐渐调整参数来确定所用记录仪的详细程度,性能,信噪比。