Go 中的低成本跟踪日志记录:在没有性能开销的情况下禁用日志语句
能够在不影响关键路径的情况下添加调试日志语句生产性能至关重要。然而,在 Go 中,评估禁用语句的参数的成本可能会很大。
定制的 Logger
为了解决这个问题,可以创建一个 EnabledLogger,实现log.Logger 接口并仅在启用时将输出委托给 log.Logger。这在禁用时有效地隐藏了格式化和日志记录操作。
EnabledLogger 的局限性
虽然 EnabledLogger 最大限度地减少了简单数据类型的评估成本,但它不处理任意数据类型日志语句中的函数调用或复杂表达式。为了缓解这种情况,有两个选项可用:
包装类型:
像 Stringify 这样的包装类型可以推迟仅在启用时才评估的函数调用。虽然很冗长,但这种方法确保格式化被延迟到执行。
手动检查:
显式检查也可用于有条件地执行格式化,但这是容易出错,需要仔细注意以确保一致性。
替代解决方案
除了这些选项之外,其他方法包括:
格式化程序接口:
fmt.Stringer 和 fmt.GoStringer 可用于推迟实现这些接口的类型的格式化。
自定义记录器:
在运行时使用自定义记录器覆盖默认记录器可以更好地控制数据评估。
作为布尔值的记录器:
一种简单而有效的技术就是使用 bool 值作为记录器本身,通过消除 if 语句的需要来简化代码。
代码生成:
可以在 Go 中模拟预处理宏使用代码生成,生成仅包含必要的跟踪语句的调试版本。
以上是如何在 Go 中实现高效、低成本的跟踪日志记录而不产生性能开销?的详细内容。更多信息请关注PHP中文网其他相关文章!