swift - 以最少的工作和维护捕获 Swift 日志行中的局部变量

标签 swift logging metaprogramming sourcekit

我正在尝试将局部变量值/名称添加到我的 Swift 日志行中。开箱即用的 Swift 提供了一种用 #file#function 等装饰日志行的好方法 without 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. fork Swift 并实现我自己的 #localVars 特殊文字
    跟上 Swift 的更改可能比手动添加局部变量字典要更多的工作我的日志行
  3. 等待 Swift 编译器插件成为现实
    可能需要很长一段时间,也许永远
  4. 构建一个基于 SourceKit 的工具,在编译前注入(inject)本地 var 映射
    可能是最可行的选择,但也有其挑战。如何编辑转换前版本但让 Xcode 编译转换后版本?我可以只转换自上次转换以来编辑过的文件吗? Xcode 是否对我的文件的转换前或转换后版本建立索引?
  5. 手动继续
    在数千条日志行中编写(并维护和费力地浏览)烦人的局部变量字典。呃
  6. 忘记整个想法
    那会很遗憾。在我的事件日志中包含本地内容(即使只是在开发中运行时)使这些日志更容易理解

我真的希望有人能提出一个绝妙的建议,因为上述选项似乎都没什么启发性

最佳答案

我不太确定这个问题是否符合这个目的。是的,它是关于编程的,但它是关于某种众所周知的状态(你不能在 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

您不知道您是否是唯一想要它的人,除非您将此类问题/讨论移至:

我不确定有多少 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 编译器更紧密集成的工具可能会成为该项目的一个很好的补充。我主要担心的是插件接口(interface)的稳定性和安全性。

&

这些都没有设计,但这里可以构建很多很棒的东西。如果您有兴趣进一步探索这一点,我认为自然的一点是首先在 swift-dev 上弄清楚技术方向。 swift-evolution 提案似乎是大量讨论和设计的自然产物,但我预计对 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 在构建开始之前保存全部,但没有成功。有时有效,有时无效。

这可行吗?或许。我最终向苹果报告了这个问题,但还没有反馈/修复。如果您决定走这条路,这只是您将面临的一个例子。


Continue manually

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

这是一个问题 - 人们应该比较一下它需要多少工作。您是否能够以这种方式修改 Swift 编译器,使其花费的时间比此手 Action 业的总时间更少? future 呢?您愿意花时间合并更改和不断更新吗?特别是当内部结构可以改变时?

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


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

你真的需要日志中的所有本地人吗?这是不是一个好主意?我不知道您的案例背景,也不知道您为什么开始考虑这个问题,但我不太喜欢受污染的原木。

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

您写道 - 即使只是在开发中运行时 - 为什么不利用我们已有的工具?例如,就像提到的断点一样。您考虑过安全/隐私方面吗?当您跳过此条件(仅开发)时,它也将变成生产,这根本不是一个好主意。您认为 Apple 为什么要编辑日志中的数据(请参阅 Formatting Log Messages)?

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

关于swift - 以最少的工作和维护捕获 Swift 日志行中的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61910191/

相关文章:

java - 如何在这个简单的 Java Logging 实现中附加到日志文件?

c++ - C++ 有运行时元编程功能吗?

ios - 嵌套的 Json 解码器 Swift

view - iOS 8 - Swift - Xcode 6 Beta - 在没有界面生成器的情况下工作(没有 Nib 和 Storyboard)

docker - Docker日志填充正在运行的容器

powershell - 将 PowerShell 命令记录到日志文件

c++ - Q : Generate argument list at compile time

C++在编译时将字符串文字转换为多字 rune 字

swift - 试图找到一种更简单的方法来自动反转 .on 和 off。快速状态

ios - iPhone 应用程序在收到推送通知时崩溃