优秀的编程知识分享平台

网站首页 > 技术文章 正文

后端日志最佳实践(后端教程)

nanyue 2024-09-01 20:39:32 技术文章 10 ℃

更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)

对于后端开发人员,日志记录是服务程序的窗口。与前端不同,如果没有一些日志消息,那么就没有什么可看的。以下是在编写日志时使用的一些准则。


请求之后,而不是之前

每艘船都写有航海日志。它就像一本日记,记录了一整天的重要事件。就像传统航海日志一样,我们应该记录已经发生的事情,而不是将要做的事情。

举个例子:

// don't do that
log.info("Making request to REST API")
restClient.makeRequest()
// do that
restClient.makeRequest()
log.info("Made request to REST API")

阅读第一个日志语句,你不知道 REST 调用是否成功。然后,你必须查找是否存在异常。如果阅读了此日志但遗漏了后面的异常,反而会感到困惑。

第二个日志要好得多。它清楚地表明之前的操作是成功的。如果 REST 调用失败,将不会看到此日志 - 而是会出现异常。

将此规则应用于所有 INFO 日志。但不是DEBUG日志。


单独的参数和消息

典型的日志消息包含两种类型的数据。一种类型是手写消息,说明正在进行。第二种类型是操作中涉及的(技术)参数列表。应该将两个部分分开。

// don't do that
restClient.makeRequest()
log.info("Made request to {} on REST API.", url)
// do that
restClient.makeRequest()
log.info("Made request to REST API. [url={}]", url)

第一条日志消息有一些缺陷。例如,很难解析 Grok 模式(结构化日志)。很难使用日志工具自动提取 ID 或参数。读起来也很困难。想象一下,一个很长的 URL 可能在其末尾带有参数列表。一半的日志消息可能不在屏幕上。而且,消息更难以扩展。如果要添加另一个参数(例如HTTP请求方法),则必须重写整个句子。

第二个版本没有这些缺陷。由于参数列表具有清晰的语法,因此很容易解析。它很容易阅读,因为可以在参数的分界。很容易扩展,只需将另一个参数添加到列表中即可。


WARNING 和 ERROR 的区别

WARNING 和 ERROR 之间有一些关键的区别。

如果执行了一些实际有效的操作,但出现了一些问题——这是一个警告。但是如果你做了一些操作,但它根本不起作用——那就是一个错误。

再看一个例子:

try {
    restClient.makeRequest()
    log.info("Made request to REST API. [url={}]", url)
} catch(e: UnauthorizedException) {
    log.warn("Request to REST API was rejected because user is unauthorized. [url={}, result={}]", url, result)
} catch(e: Exception) {
    log.error("Request to REST API failed. [url={}, exception={}]", url, exception)
}

REST 调用可能有以下三种结果:

  • 它正常运行。这是一个 INFO(调用之后)。
  • 它可能会因意外异常而失败。这是一个错误。
  • 它可能会导致一些预期的异常。这是一个警告。

因此,在出现警告的情况下,你做了一些事情,但没有完美地完成。如果出现错误,你没有这样做。

另请注意,警告(当然也是错误)是号召性用语。如果没有人需要做出反应并做某事,那么不需要记录警告。


INFO 用于业务,DEBUG 用于技术

INFO 日志应该看起来像一本书。它告诉你发生了什么,而不一定是如何发生的。这意味着与技术内容相比,INFO 更适合用于类似业务的日志消息。与技术相关的消息(通常)应该是 DEBUG。

INFO | User registered for newsletter. [user="Thomas", email="thomas@tuhrig.de"]
INFO | Newsletter send to user. [user="Thomas"]
INFO | User unsubscribed from newsletter. [user="Thomas", email="thomas@tuhrig.de"]

这种类型的日志是从业务的角度描述一些日志故事。看看下面显示什么是技术日志?

DEBUG | Saved user to newsletter list. [user="Thomas", email="thomas@tuhrig.de"]
DEBUG | Send welcome mail. [user="Thomas", email="thomas@tuhrig.de"]
INFO | User registered for newsletter. [user="Thomas", email="thomas@tuhrig.de"]
DEBUG | Started cron job to send newsletter of the day. [subscribers=24332]
INFO | Newsletter send to user. [user="Thomas"]
INFO | User unsubscribed from newsletter. [user="Thomas", email="thomas@tuhrig.de"]

每个(业务)用例都会生成一行 INFO 日志。此外,还有 DEBUG 日志可以更详细地了解该过程的工作方式。

Tags:

最近发表
标签列表