环形缓冲区伐木,趣味盎然,利润丰厚

2020-07-28 14:24:55

日志记录并不便宜,因此当我们将代码部署到生产环境中时,通常会禁用调试级别日志(或更低级别)。当事情进展顺利时,这不是问题。但是,当错误日志弹出时,与代码中发生的事情相关的大部分上下文都会丢失。关于堆栈跟踪的一行内容通常是不够的。如果能对失败时发生的事情有一个更详细的描述,那就太好了。如果我们打开了这些调试和跟踪日志就好了。

嗯,我们不买是有原因的。简单地说,它很贵。通常,调试和跟踪级别的日志比所有其他日志级别的总和多一个数量级。因此,如果我们要将其全部记录下来,我们将不得不多花几倍的钱。

这是围绕这一端的大多数谈话的地方。选项2不能启动,所以我们选择选项1。如果出现错误,我们尝试在调试开始时在本地复制错误,并从那里开始工作。

幸运的是,这是一种错误的二分法。我们还有第三个选择。使用环形缓冲区存储调试日志,并在发生错误时刷新它。

这项技术在概念上很简单。这只需要一句话来描述,并且记录的方式没有太多改变。我们仍然使用相同的日志库和相同的日志软件模式,但现在当出现问题时,我们可以访问日志中更多的信息。

你可以既吃蛋糕又吃蛋糕。您可以避免冗长的日志记录,同时在重要的时候可以访问这些冗长的日志。

假设我们正在为我们的在线小工具商店构建一个Django后端,并说下面的伪代码中的某个地方有一个bug。

#Handle the order def handle_order_post_request(Req):Customer=Get_Customer(Req)if not is_Authorized_Customer(Customer):return HttpStatusUnAuthorized()Orders=Get_Orders(Req)VERIFY_PRICES(ORDERS)#验证价格是否为最新VERIFY_INSTORY(ORDERS)#如果缺货CHECKOUT_INFO=PROCESS_ORDER(ORDER)SAVE_CHECKOUT(CHECUOUT_INFO)RETURN HttpStatusOk,则从结账中删除。Order(Orders:List[OrderItems])->;CheckoutInfo:记录器.debug(";总价:%d";,order.price)TOTAL_PRICE=SUM([Order.Price for Orders in Orders])MOST_EXPICAL_ITEM=max(Orders,Key=lambda Order:Order.Price)return CheckoutInfo(TOTAL_PRICE,MOST_EXPICAL_ITEM,)

我一直在构建这个python工具,它让您无需重启即可在运行的python中动态插入新日志。查看GitHub上的回购。

如果您知道我错过的任何其他链接,或者只是想联系,请给我发电子邮件到<;my-first-name>;@<;my-last-name>;.com