隐藏不需要的奇怪 Xcode 日志

Hide strange unwanted Xcode logs

当使用 Xcode 8+ 并创建一个新的空白项目时,运行 应用程序会出现以下日志:

2016-06-13 16:33:34.406093 TestiOS10[8209:100611] bundleid: com.appc.TestiOS10, enable_level: 0, persist_level: 0, propagate_with_activity: 0
2016-06-13 16:33:34.406323 TestiOS10[8209:100607] Created DB, header sequence number = 248
2016-06-13 16:33:34.409564 TestiOS10[8209:100611] subsystem: com.apple.UIKit, category: HIDEvents, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0
2016-06-13 16:33:34.504117 TestiOS10[8209:100607] Created DB, header sequence number = 248
2016-06-13 16:33:34.548023 TestiOS10[8209:100607] subsystem: com.apple.BaseBoard, category: MachPort, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0
2016-06-13 16:33:34.568458 TestiOS10[8209:100608] subsystem: com.apple.FrontBoard, category: Common, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0

也许有人已经找到了可以处理的配置?

这与 Xcode 8 Beta Release Notes 中发现的已知日志记录问题有关(也询问了 WWDC 的工程师)。

When debugging WatchOS applications in the Watch simulator, the OS may produce an excessive amount of unhelpful logging. (26652255)

目前没有可用的解决方法,您必须等待 Xcode 的新版本。

编辑 2016 年 7 月 5 日:这应该是从 Xcode 8 Beta 2 开始修复的:

Resolved in Xcode 8 beta 2 – IDE

Debugging

  • When debugging an app on the Simulator, logs are visible. (26457535)

Xcode 8 Beta 2 Release Notes

这个解决方案对我很有效:

  1. 运行模拟器中的应用程序
  2. 打开系统日志( + /)

这将转储所有调试数据以及您的 NSLog。

仅过滤您的 NSLog 语句:

  1. 为每个符号加上前缀,例如:NSLog(@"^ Test Log")
  2. 使用右上角的搜索框过滤结果,上例中为“^”

这是你应该得到的:

对我来说,Xcode 版本 8.0 beta 2 (8S162m) 中仍未修复此问题,额外的日志也出现在 Xcode 控制台中

** 编辑 2016 年 8 月 1 日:这已在 release notes for Xcode 8 Beta 4 (8S188o) as an issues still persisting.

中得到确认

Known Issues in Xcode 8 beta 4 – IDE

Debugging

• Xcode Debug Console shows extra logging from system frameworks when debugging applications in the Simulator. (27331147, 26652255)

估计GM版本会解决这个问题。在那之前耐心等待,虽然不理想,但我正在使用的解决方法如下...

与我之前的回答类似:

  • 使用某种特殊字符(例如 * 或 ^ 或 ! 等)为我的打印日志添加前缀

  • 然后使用控制台窗格右下角的搜索框通过输入我选择的特殊字符来过滤我的控制台日志,以使控制台按预期显示我的打印日志

我的解决方案是在断点中使用调试器命令 and/or Log Message

并将控制台的输出从 All Output 更改为 Debugger Output like

试试这个:

1 - 从 Xcode 菜单 打开:Product > Scheme > Edit Scheme

2 - 在您的 环境变量 上设置 OS_ACTIVITY_MODE = disable

一条推文为我找到了答案 - https://twitter.com/rustyshelf/status/775505191160328194

要阻止 Xcode 8 iOS 模拟器疯狂记录,请在调试方案中设置环境变量 OS_ACTIVITY_MODE = 禁用。

成功了。

好的。关于这个似乎有很多骚动,所以我会给你们一个方法来坚持它而不使用那个计划技巧。我将专门解决 iOS 模拟器,但这也可能需要应用于位于不同目录中的 TV Sim。

导致所有这些问题的问题是位于 Xcode 目录中的 plist。当 Sim 启动时,会启动一个名为 configd_sim 的进程,它会读取 plist 并在 plist 指定应记录它们时打印调试信息。

plist 位于此处:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Preferences/Logging/Subsystems

如果您使用的是测试版,请注意目录会有所不同。

您将在该目录中看到许多plist。现在,构建并 运行 您的应用程序并观察日志。您正在查找紧跟 subsystem: 部分的内容。紧随其后的名称代表相应的有问题的 plist。

从那里,修改 plist 以删除调试 [Level] key/value 这是一个包含 "Enable" => "Default" key/value... 的字典,或者只是简单地删除 plist .请注意,您需要成为 root 用户才能执行这些操作,因为它们位于 Xcode 应用程序中。

plutil -p 命令可能对您也有用。即

plutil -p /Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/System/Library/Preferences/Logging/Subsystems/com.apple.BackBoardServices.fence.plist

这给了我一个有问题的 plist,其中包含:

{ "DEFAULT-OPTIONS" => { "Level" => { "Enable" => "Default" }}}

祝你好运:]

OS_ACTIVITY_MODE 对我不起作用(可能 是因为我将 disable 打错为 disabled,但不是这不是更自然吗?!?),或者至少没有阻止大量消息。所以这里是环境变量的真正处理。

https://llvm.org/svn/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp

lldb_private::Error
PlatformDarwin::LaunchProcess(lldb_private::ProcessLaunchInfo &launch_info) {
  // Starting in Fall 2016 OSes, NSLog messages only get mirrored to stderr
  // if the OS_ACTIVITY_DT_MODE environment variable is set.  (It doesn't
  // require any specific value; rather, it just needs to exist).
  // We will set it here as long as the IDE_DISABLED_OS_ACTIVITY_DT_MODE flag
  // is not set.  Xcode makes use of IDE_DISABLED_OS_ACTIVITY_DT_MODE to tell
  // LLDB *not* to muck with the OS_ACTIVITY_DT_MODE flag when they
  // specifically want it unset.
  const char *disable_env_var = "IDE_DISABLED_OS_ACTIVITY_DT_MODE";
  auto &env_vars = launch_info.GetEnvironmentEntries();
  if (!env_vars.ContainsEnvironmentVariable(disable_env_var)) {
    // We want to make sure that OS_ACTIVITY_DT_MODE is set so that
    // we get os_log and NSLog messages mirrored to the target process
    // stderr.
    if (!env_vars.ContainsEnvironmentVariable("OS_ACTIVITY_DT_MODE"))
      env_vars.AppendArgument(llvm::StringRef("OS_ACTIVITY_DT_MODE=enable"));
  }

  // Let our parent class do the real launching.
  return PlatformPOSIX::LaunchProcess(launch_info);
}

所以在环境变量中将 OS_ACTIVITY_DT_MODE 设置为 "NO"(主要答案中的 Schemes 屏幕截图中解释的 GUI 方法)使它对我有用。

至于 NSLog 作为系统消息、错误和您自己的调试的垃圾场:无论如何都可能需要真正的日志记录方法,例如https://github.com/fpillet/NSLogger.

喝新的 Kool-Aid:http://asciiwwdc.com/2016/sessions/721 https://developer.apple.com/videos/play/wwdc2016/721/ 大修整个日志记录后出现一些问题也就不足为奇了 API.

附录

无论如何,NSLog只是一个垫片:

https://developer.apple.com/library/content/releasenotes/Miscellaneous/RN-Foundation-OSX10.12/

NSLog / CFLog

NSLog is now just a shim to os_log in most circumstances.

现在只有引用其他环境变量的来源才有意义。完全不同的地方,这次来自 Apple 内部。不确定为什么它们重叠。 [关于 NSLog 的错误评论已删除]

[9 月 22 日编辑]:我想知道 "release" 和 "stream" 与 "debug" 有何不同。来源不足。

https://github.com/macosforge/libdispatch/blob/8e63547ea4e5abbfe55c0c3064181c4950a791d3/src/voucher.c

e = getenv("OS_ACTIVITY_MODE");
if (e) {
    if (strcmp(e, "release") == 0) {
        mode = voucher_activity_mode_release;
    } else if (strcmp(e, "debug") == 0) {
        mode = voucher_activity_mode_debug;
    } else if (strcmp(e, "stream") == 0) {
        mode = voucher_activity_mode_stream;
    } else if (strcmp(e, "disable") == 0) {
        mode = voucher_activity_mode_disable;
    }
}

基于@rustyshelf 的原始 tweet 和 iDevzilla 的图解答案,这是一个解决方案,可以在不禁用设备的 NSLog 输出的情况下消除模拟器的噪音。

  1. 在 Product > Scheme > Edit Scheme... > 运行 (Debug) 下,将 OS_ACTIVITY_MODE 环境变量设置为 ${DEBUG_ACTIVITY_MODE} 如下所示:

  1. 转到您的项目构建设置,然后单击 + 添加名为 DEBUG_ACTIVITY_MODE 的 User-Defined 设置。展开此设置并单击“调试”旁边的 + 以添加 platform-specific 值。 Select 下拉菜单并将其更改为 "Any iOS Simulator"。然后将它的值设置为 "disable" 所以它看起来像这样:

这在 xcode 8.1 (已测试版本 8.1 beta (8T46g)) 中不再是问题。您可以从方案中删除 OS_ACTIVITY_MODE 环境变量。

https://developer.apple.com/go/?id=xcode-8.1-beta-rn

Debugging

• Xcode Debug Console no longer shows extra logging from system frameworks when debugging applications in the Simulator. (26652255, 27331147)

请找到以下步骤。

  1. Select 产品 => 方案 => 编辑方案或使用快捷方式:CMD + <
  2. Select 左侧的 Run 选项。
  3. 在环境变量部分,添加变量 OS_ACTIVITY_MODE = disable

有关详细信息,请查找以下 GIF 表示。

Xcode10OS_ACTIVITY_MODE变量与disable(或default)值也关闭了NSLog 不管怎样。

所以如果你想摆脱控制台噪音而不是你自己的日志,你可以尝试使用旧的 printf("") 而不是 NSLog,因为它不受 OS_ACTIVITY_MODE = disable.

但最好看看新的 os_log API .

请注意,对于 iOS 14 模拟器,OS_ACTIVITY_MODE=disable 将不会使用新的 Swift 记录器显示任何日志。您将不得不删除或启用它。

我阅读了所有解决方案,到目前为止没有任何效果,我在撰写此回复时使用的是 XCODE 12.5,在调试器中看到这样的 heap/flood 是最烦人的事情不需要的消息。

我所做的解决方案比大多数复杂的解决方案简单得多,以下是我为解决这个恼人的问题所做的工作:

  1. 不需要使用任何环境变量等,否则按照之前帖子的建议使用这些会禁用 NSLOG 输出,这在这种情况下不是您想要的。

  2. 我确保我所有的 NSLOG 都包含一个我稍后会监控的字符串,例如:

以前我是这样做的:

NSLog(@"Hello World");

现在,我这样做:

NSLog(@"[Admin]: Hello World");

而“[Admin]”是我程序的名称(或者除 [Admin] 之外您喜欢的任何字符串)

  1. (可选步骤)或(更简单),我写了一个函数来将(嗯;代理)NSLog 引导到另一个全局函数“Log”中,而我所有的记录都将转到该函数,然后Log 函数会将“[Admin]”字符串附加到原始日志记录字符串,并添加日志记录时间和我需要的其他项目等(类似于 WebLogic 或任何其他 JAVA 日志记录),这确保所有日志都将遵循一个标准。

  2. ...百万美元的核武器在这里:

现在,进入您的调试器 window,在底部您会看到“搜索”window,而它显示的是“过滤器”,输入您的字符串(例如;“[Admin]” ), 按 ENTER,然后工作完成。

这样,你只会看到你喜欢看的台词,

当您想过滤掉其他组件时也很有用,例如,对于网络通信,我使用更多的字符串,以后可以过滤。

换句话说,与您的应用程序无关的烦人日志行将一直存在,但您使用上述命令选择不查看它们,我希望能解决问题。

祝大家有个美好的一天。

H