当出现问题时,日志可以成为我们的生命线。为了解决问题,我们必须重现问题,而调试日志记录的价值是无价的。但有一个问题——成本。随着应用程序的扩展,获取和存储日志记录的成本也会增加,这迫使我们在日志记录太少而无用或为我们不使用的日志付费之间进行权衡。
Thom Shutt 曾经提出只记录错误的论点,建议放弃警告、信息和调试级别。他的理由是什么?在生产中更改日志级别的困难:
丢弃级别 - 您最后一次在信息以外的任何地方运行生产是什么时候?更改级别是一个团队中每个人都知道如何做的快速过程吗?
事实上,我们大多数人不会经常更改日志级别,因为它需要提交、构建和部署。如果更改日志级别是一个乏味的过程,那么这些额外的行确实会变成噪音。
输入动态配置。虽然许多人可能不熟悉它,但那些接受过它的人无法想象没有它的生活。与应用程序读取属性文件或环境变量的静态配置不同,动态配置顾名思义是动态的。
它提供了通过 UI 设置新值的能力,确保每次评估都能检索最新版本。
该技术是动态日志记录的支柱。通过将 Logger -> LogLevel 映射存储在我们的配置系统中并根据更改更新记录器,我们可以在几毫秒(而不是几小时)内从警告转变为调试。
Prefab正在彻底改变我们记录日志的方式。使用预制件,您可以:
大规模伐木的成本会变得非常严重,并且都与数量有关。聚合商正在提供新的方法来尝试减少这种支出,例如 Datadog 的Log Without Limits ,而Cribl基本上是一家致力于解决这个问题的公司。
但所有这些解决方案都根据使用情况向您收费。归根结底,您仍然需要为发送的日志付费。
由于您的日志不通过 Prefab,因此它不会根据日志量收费,而只是根据向服务器提供动态配置来收费。 Prefab 只是控制过滤器的值,确保您只记录必要的内容。这种方法可以显着节省成本,特别是对于大规模应用程序。
采用动态日志记录不仅仅是使用新工具;这是一种文化转变。最初,这可能看起来令人畏惧。但随着团队逐渐习惯有针对性的日志记录的力量,它会培养更强大的操作思维。开发人员现在可以思考:“如果情况出现问题,我需要什么信息?”并做好相应准备。
例如,考虑以下代码片段:
def charge(user, amount) balance = get_balance(user) min_balance = get_min_balance(user) do_charge = balance > min_balance logger.debug("charge decision", charge: do_charge, amount: amount, balance: balance, user_id: user.id, min_balance: min_balance) if do_charge charge_user(user, amount) else end
以前,许多人将logger.debug
行视为纯粹的开发噪音。但通过动态日志记录,这些线路成为宝贵的工具,可以在需要时激活。
伐木业的格局正在发生翻天覆地的变化。借助Prefab这样的工具,开发人员不再需要在详细日志和成本效率之间做出选择。动态日志记录提供了两全其美的优点,可以在需要时提供见解,而无需支付高昂的价格标签。
调试愉快! 🚀