更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)
对于后端开发人员,日志记录是服务程序的窗口。与前端不同,如果没有一些日志消息,那么就没有什么可看的。以下是在编写日志时使用的一些准则。
请求之后,而不是之前
每艘船都写有航海日志。它就像一本日记,记录了一整天的重要事件。就像传统航海日志一样,我们应该记录已经发生的事情,而不是将要做的事情。
举个例子:
// 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 日志可以更详细地了解该过程的工作方式。