网站首页 > 技术文章 正文
更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)
对于后端开发人员,日志记录是服务程序的窗口。与前端不同,如果没有一些日志消息,那么就没有什么可看的。以下是在编写日志时使用的一些准则。
请求之后,而不是之前
每艘船都写有航海日志。它就像一本日记,记录了一整天的重要事件。就像传统航海日志一样,我们应该记录已经发生的事情,而不是将要做的事情。
举个例子:
// 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 日志可以更详细地了解该过程的工作方式。
猜你喜欢
- 2024-11-22 前端容器化实践
- 2024-11-22 npm audit —— 守护Node.js前端代码安全的小助手
- 2024-11-22 程序员私活利器 (Jfinal)——找到一次请求的所有日志
- 2024-11-22 完美日记的微服务实践和优化思路
- 2024-11-22 线上程序出bug,排查起来很麻烦?一个好的日志系统是关键
- 2024-11-22 MySQL慢查询:慢SQL定位、日志分析与优化方案
- 2024-11-22 ELK Stack实用教程:让你的日志数据发挥更大的价值
- 2024-11-22 干货 | 企业如何快速采集分析日志?
- 2024-11-22 Spring Boot 整合 Apache Spark 进行日志分析?
- 2024-11-22 Windows系统服务器系统日志在哪里查看?
你 发表评论:
欢迎- 07-10Oracle 与 Google Cloud 携手大幅扩展多云服务
- 07-10分享收藏的 oracle 11.2.0.4各平台的下载地址
- 07-10Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- 07-10Oracle Database@Azure 推进到南美等新区域并增加了新服务
- 07-10Oracle宣布推出 Oracle Database@AWS 的有限预览版
- 07-10Oracle与Nextcloud合作,推出主权云上的安全协作平台
- 07-10NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 07-10对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 602℃几个Oracle空值处理函数 oracle处理null值的函数
- 594℃Oracle分析函数之Lag和Lead()使用
- 582℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 579℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 574℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 567℃【数据统计分析】详解Oracle分组函数之CUBE
- 554℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 548℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- Oracle 与 Google Cloud 携手大幅扩展多云服务
- 分享收藏的 oracle 11.2.0.4各平台的下载地址
- Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- Oracle Database@Azure 推进到南美等新区域并增加了新服务
- Oracle宣布推出 Oracle Database@AWS 的有限预览版
- Oracle与Nextcloud合作,推出主权云上的安全协作平台
- NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 解读丨《归档文件整理规则》— 电子文件元数据存储
- Data Guard跳归档恢复的实践(dataguard failover)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)