隐藏奇怪的不需要的Xcode日志

时间:2016-06-13 23:39:12

标签: ios xcode logging xcode8 ios10

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

24.0.0

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

14 个答案:

答案 0 :(得分:1435)

试试这个:

1-从Xcode菜单打开:产品>方案>编辑方案

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

Screenshot

答案 1 :(得分:342)

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

  1. 在产品>下方案>编辑方案...>运行(Debug),将OS_ACTIVITY_MODE环境变量设置为$ {DEBUG_ACTIVITY_MODE},如下所示:
  2. enter image description here

    1. 转到项目构建设置,然后单击+以添加名为DEBUG_ACTIVITY_MODE的用户定义设置。展开此设置并单击Debug旁边的+以添加特定于平台的值。选择下拉列表并将其更改为"任何iOS模拟器"。然后将其值设置为"禁用"所以它看起来像这样:
    2. enter image description here

答案 2 :(得分:79)

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

OR

喝新的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现在只是os_log的一个垫片。

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

[9月22日编辑]:我想知道“发布”和“流”与“调试”有什么不同。资料不足。

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;
    }
}

答案 3 :(得分:63)

推文给了我答案 - https://twitter.com/rustyshelf/status/775505191160328194

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

有效。

答案 4 :(得分:32)

对于我来说,这在Xcode版本8.0 beta 2(8S162m)中仍然没有修复,并且Xcode控制台中还出现了额外的日志

**编辑8/1/16:这已在release notes for Xcode 8 Beta 4 (8S188o) as an issues still persisting中得到确认。

  

Xcode 8 beta 4中的已知问题 - IDE

     

<强>调试

     

•Xcode Debug Console显示系统框架的额外日志记录    在Simulator中调试应用程序。 (27331147,26652255)

据推测,这将由通用汽车发布解决。在那之前耐心虽然并不理想,但我使用的解决方法是......

与之前的答案类似,我不得不:

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

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

console

答案 5 :(得分:32)

请查看以下步骤。

  1. 选择产品=&gt; Scheme =&gt;编辑方案或使用快捷方式:CMD + <
  2. 从左侧选择Run选项。
  3. 在“环境变量”部分,添加变量 OS_ACTIVITY_MODE =禁用
  4. 有关详细信息,请参阅以下GIF表示。

    Edit Scheme

答案 6 :(得分:21)

我的解决方案是在断点中使用调试器命令和/或日志消息

enter image description here

将控制台的输出从所有输出更改为调试器输出,如

enter image description here

答案 7 :(得分:13)

这与Xcode 8 Beta Release Notes中发现的已知问题有关(也问过WWDC的工程师)。

  

在Watch模拟器中调试WatchOS应用程序时,操作系统可能会产生过多的操作   无益的伐木量。 (26652255)

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

编辑7/5/16:从Xcode 8 Beta 2开始,这应该是固定的:

  

已解决Xcode 8 beta 2 - IDE

     

调试

     
      
  • 在模拟器上调试应用程序时,日志可见。 (26457535)
  •   

Xcode 8 Beta 2 Release Notes

答案 8 :(得分:13)

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

引起所有这些问题的问题是位于Xcode目录中的plists。当Sim启动时,有一个进程被称为 configd_sim ,如果plists指定它们应该被记录,则会打印调试信息。

柱子位于:

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

如果您正在使用测试版,请注意目录将有所不同。

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

enter image description here

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

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

这给了我一个有问题的包括:

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

祝你好运:]

答案 9 :(得分:7)

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

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

  

调试

     

•Xcode Debug Console不再显示来自系统的额外日志记录   在Simulator中调试应用程序时的框架。 (26652255,   27331147)

答案 10 :(得分:1)

此解决方案一直在为我工作:

  1. 在模拟器中运行应用
  2. 打开系统日志( + /
  3. 这将转储所有调试数据以及NSLog。

    仅过滤NSLog语句:

    1. 使用符号作为前缀,例如:NSLog(@"^ Test Log")
    2. 使用右上方的搜索框过滤结果,&#34; ^&#34;在上面的案例中
    3. 这是你应该得到的:

      Screenshot of console

答案 11 :(得分:0)

Xcode 10 中,具有\n(或OS_ACTIVITY_MODE)值的disable变量也将关闭default

因此,如果您想摆脱控制台噪音而不是自己的日志,则可以尝试使用旧的NSLog而不是NSLog,因为它不受printf("") = { {1}}。

但是最好检查一下新的OS_ACTIVITY_MODE API here

答案 12 :(得分:0)

请注意,对于iOS 14 Simulator,使用新的Swift Logger不会显示OS_ACTIVITY_MODE = disable。您将必须删除或启用它。

答案 13 :(得分:0)

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

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

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

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

以前我经常这样做:

NSLog(@"Hello World");

现在,我愿意:

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

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

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

  2. ...这是价值百万美元的核武器:

现在,进入您的调试器窗口,在底部您将看到一个“搜索”窗口,其中显示“过滤器”,输入您的字符串(例如;“[Admin]”),按 ENTER,完成工作。< /p>

这样,你只会看到你喜欢看到的线条,

enter image description here

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

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

希望大家有美好的一天。

H