以最小的努力和维护在 Swift 日志行中捕获局部变量

Capturing local variables in Swift log lines with minimal effort & maintenance

我正在尝试将局部变量 values/names 添加到我的 Swift 日志行。开箱即用的 Swift 提供了一种用 #file#functionwithout explicit effort 装饰日志行的好方法。我还想更进一步,在日志站点获取范围内的所有局部变量。

log(
    message: "Things went sideways", 
    // I want to log the following dictionary of local variables without 
    // having to write, maintain or even see the dictionary
    locals: ["foo": foo, "bar": bar, "baz": baz, "buz": buz] 
)

撇开它是否是个好主意(性能、安全性、隐私、线程安全等),自动将局部变量字典传递给日志函数的最佳方法是什么?我已经有一个基于 Mirror 的解决方案来对它们进行编码。看来我的选择是:

  1. 建议 Swift 团队添加一个 #localVars 特殊文字
    似乎不​​太可能,他们已经准备好了很多,另外我可能是唯一想要它的人
  2. 分支 Swift 并实现我自己的 #localVars 特殊文字
    跟上对 Swift 的更改可能是比手动将局部变量字典添加到我的日志行更多的工作
  3. 等待 Swift 编译器插件成为一个东西
    可能是很长一段时间,也许永远
  4. 构建一个基于 SourceKit 的工具以在编译前注入本地 var 映射
    可能是最可行的选择,但也有其挑战。如何编辑预转换版本但得到 Xcode 来编译 post-转换版本?我可以只转换自上次转换以来我编辑过的文件吗? Xcode 索引我的文件的前版本或 post 转换版本吗?
  5. 手动继续
    在数以千计的日志行中编写(并维护和浏览)烦人的局部变量字典。呃
  6. 忘记整个想法
    那太可惜了。在我的事件日志中包含本地人(即使 运行 在开发中)使这些日志更容易理解

我真的希望有人能给我一个绝妙的建议,因为上面的选项似乎都没有吸引力

我不确定这个问题是否符合 SO 的目的。它是关于编程的,是的,但它是关于某种众所周知的状态(你不能在 Swift 中这样做),涵盖了很多主题,将导致你应该做什么的自以为是的答案,...

我不是在寻找赏金,但很难写出有意义且简短的评论,所以这里是“答案”


Propose the Swift team add a #localVars special literal

Seems unlikely, they have a lot on their plate already, plus I may be the only person who wants it

除非你把这种 question/discussion 移到:

,否则你不知道你是否是唯一想要它的人

我不确定有多少 Swift 工程师在 SO 上。看到了几个,但是我提到的这两个地方肯定是这个问题的更好的地方。


Fork Swift and implement my own #localVars special literal

Keeping up with changes to Swift would probably be more work than manually adding dictionaries of local variables to my log lines

如您所说,我预计这比手动构建这些词典要多得多。


Wait for Swift compiler plugins to become a thing

Could be a long time, forever perhaps

从来没有,可能,不知道。这是 Ted response:

我认为能够促进与 Swift 编译器更紧密集成的工具可能是对项目的一个很好的补充,如果它能做得好的话。我主要担心的是插件界面的稳定性和安全性。

&

None 其中有一个设计,但是可以在这里构建很多很棒的东西。如果您有兴趣对此进行更多探索,我认为一个自然点是首先在 swift-dev 上确定技术方向。 swift-进化提案似乎是大量讨论和设计的自然产物,但我希望对 Swift 的这种扩展的讨论可能会在 swift 上发生更多-devs 而不是 swift-evolution,因为它是关于编译器和工具的内部结构,而不是语言。


Build a SourceKit-based tool to inject local var maps before compilation

Probably the most feasible option, but has its challenges. How do I edit the pre-transform versions but get Xcode to compile the post-transform versions? Can I just transform the files I've edited since last transformation? Does Xcode index the pre or post transformation version of my files?

Xcode 你会遇到很多问题。例如 - 我试图将 Swift 格式化程序集成到我的构建过程中并放弃了。 Xcode 修改后的 Swift 文件有很多问题。就像 - 你编辑文件,点击构建,Swift 格式化程序重新格式化,Xcode 构建它,你尝试再次编辑文件并且出现对话框,如果你愿意,文件已被修改并带有问题重新加载它,...我还尝试在构建开始之前告诉 Xcode 全部保存,但没有用。它有时有效,有时无效。

这可行吗?可能是。我最终向 Apple 报告了它,但还没有 feedback/fix。如果您决定采用这种方式,您将面临的只是一个例子。


Continue manually

Write (and maintain and wade through) annoying dictionaries of local variables in thousands of log lines. Ugh

问题来了 - 应该比较它的工作量。您是否能够以这种方式修改 Swift 编译器,使其花费的时间少于此手动作业的总时间?未来呢?您是否愿意花时间合并更改和不断更新?特别是当内部结构可以改变时?

因为我也想自动化很多事情,所以我总是问自己 - 值得吗?


Forget the whole idea

That would be a pity. Having locals in my incident logs (even just when running in development) makes those logs far easier to understand

你真的需要日志中的所有本地人吗?这是个好主意吗?我不知道你的案例的背景或者你为什么开始考虑这个,但我不是污染日志的忠实粉丝。

我们有一个调试器,我们可以设置断点,执行表达式的断点然后自动继续,你可以将它们存储在一个项目中,你可以访问frame variable,...

您写道 - 甚至 运行 正在开发中 - 为什么不利用我们已有的工具?例如提到的断点。你考虑过security/privacy方面吗?当您跳过此条件时(仅开发),它也会变成生产,这根本不是一个好主意。为什么您认为 Apple 正在编辑日志中的数据(参见 Formatting Log Messages)?

这些问题的主要目的是——你真的需要这个吗?还有别的办法吗?这是个好主意吗?