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


694

使用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

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


1
似乎只是调试日志记录了开发中遗留的信息。调查中…
JAL

您是否关闭了xcode中的动态链接器api使用?
Teja Nandamuri

在Xcode 8中对我不起作用似乎是,此解决方案仅适用于Xcode 8 beta。
Badal Shah

我在El Capitan上使用Xcode 8.2.1遇到了这个问题。升级到macOS Sierra可以解决此问题。
hwaxxer

我仍然在Xcode 9.3上看到问题,我已经提交了Apple Bug#34767176(Xcode 9显示系统框架调试打印语句),它与打开的Bug#32256894重复,请向Apple提交该Bug的副本:bugreport.apple.com/web
保罗·索尔特

Answers:


1507

尝试这个:

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

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

屏幕截图


25
它也可以在Xcode 8.0版本上使用,所以我建议它是解决方案。
nadein

27
对于想知道如何进入该屏幕的任何人,您需要转到产品>方案>编辑方案或Cmd + <
chrishale

46
@iDevzilla,此解决方案存在一些问题,当使用真实设备时,它会从日志中删除一些重要内容,例如自记录数据。请再次概述一下,我不确定这是最理想的解决方案。
Itai Spector

104
不幸的是,此选项NSLog对我而言隐藏了所有真实设备中的所有内容……
Dmitry Isaev

8
该问题仅在模拟器中有效。我个人认为添加环境​​变量不是一个好主意,因为它还会隐藏重要的日志,例如布局约束问题以及@AirXygène给出的示例。在模拟器中,您还可以按“ CMD + /”打开控制台,它将为您提供老式的日志。希望苹果公司会在Xcode中解决此问题,不过,人们对增加投票的数量很感兴趣;)
Bocaxica

360

该解决方案基于@rustyshelf 的原始推文以及iDevzilla给出的图解答案,此解决方案可在不禁用设备的NSLog输出的情况下使模拟器的噪声静音。

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

在此处输入图片说明

  1. 转到项目构建设置,然后单击+添加一个名为DEBUG_ACTIVITY_MODE的用户定义设置。展开此设置,然后单击“调试”旁边的+以添加特定于平台的值。选择下拉列表并将其更改为“ Any iOS Simulator”。然后将其值设置为“ disable”,如下所示:

在此处输入图片说明


6
@NSNoob确保env变量中没有空格。
sbarow '16

7
太可惜了,这不是被接受的答案,太可惜了,这个答案失去了最高票数。很多更好的答案恕我直言,因为它仅DEBUG禁用OS_ACTIVITY_MODE建立在模拟器。
斯旺尼,2016年

18
这对我没有用,投票最多的答案也没有。在OS X 10.11.6 El Capitan上使用Xcode 8.2.1。但是有效的方法是将此答案与BaseZen的答案结合起来,使用OS_ACTIVITY_DT_MODE而不是OS_ACTIVITY_MODE。(而且出乎我意料的是,至少“ NO”和“ disable”都关闭了猖logging的日志记录。)
RenniePet

1
@RenniePet,这正是为我做的。谢谢!
米沙

8
此解决方案将隐藏所有以Xcode 9开头的NSLog。要保留NSLog,请替换disabledefault
心教堂

88

OS_ACTIVITY_MODE不适用于我(可能是因为我打错disabledisabled,但不是更自然吗?!?),或者至少没有阻止大量消息。所以这是处理环境变量的真正方法。

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,在环境变量中设置为“否”(主要答案的“方案”屏幕快照中说明的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现在只是os_log的填充程序。

现在仅在引用另一个env变量的源时才有意义。这次与苹果内部截然不同。不知道为什么它们重叠。[关于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;
    }
}

11
总是很高兴看到一个提供原因和背景的答案,而不仅仅是快速解决方案。
jscs

使用OS_ACTIVITY_DT_MODE = NO解决了这个问题
Almas Adilbek 16/09/28

1
这会产生与OS_ACTIVITY_MODE = disable不同的行为吗?有什么理由更喜欢这种解决方案吗?
n8gray

1
它不是。它掩盖了一切。
durazno

2
@Frizlab是的,我在帖子中都提到了这两个。参见“ OR”……我os_log非正式地将其称为新的Kool Aid。
BaseZen

64

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

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

有效。


6
如前所述:OS_ACTIVITY_MODE = disable禁用所有其他使用NSLog的日志记录。
dzensik

5
此解决方案将隐藏所有以Xcode 9开头的NSLog。要保留NSLog,请替换disabledefault
心教堂

34

请找到以下步骤。

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

有关更多信息,请找到下面的GIF表示形式。

编辑方案


3
等待...。第二次运行成功。Gif视频的荣誉。最好的答案总是在底部!
eonist

2
此解决方案将隐藏所有以Xcode 9开头的NSLog。要保留NSLog,请替换disabledefault
心教堂

33

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

**编辑8/1/16:Xcode 8 Beta 4(8S188o)发行说明已经确认了这一点,因为问题仍然存在

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

调试

•在模拟器中调试应用程序时,Xcode调试控制台显示来自系统框架的额外日志记录。(27331147,26652255)

大概这将在GM版本中解决。在此之前,耐心虽然不是很理想,但我正在使用的解决方法如下...

与先前的答案类似,我必须:

  • 给我的打印日志加上一些特殊字符(例如*或^或!等)

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

安慰


1
@SimplyLearning您将在整个Twitter上找到此信息。但是您可以从apple上访问此官方网站:developer.apple.com/news或他们的新闻提要,以在发布它们时获取更新:developer.apple.com/news/rss/news.rss顺便说一句:这似乎仍然在Xcode中贝塔3个问题
benrudhart

50
刚得到Xcode 8 GM,问题仍然存在。很烦人!!
AdamM

8
刚刚从App Store下载了Xcode 8.0(8A218a)。问题仍然存在。
Statik

4
简直荒谬。仍在MAS最终版本中。
Shai Mishali

1
我们使用标签前缀进行过滤。一些问题是:多行仅显示第一个。使用lldb进行调试时,需要切换过滤。直到今天,该控制台的功能非常有限,这真的让我感到非常难过。我们有一个用于体面过滤的应用程序,但是我们需要从控制台复制/粘贴。多么悲伤。
bauerMusic

23

我的解决方案是在断点中使用debugger命令和/或Log Message

在此处输入图片说明

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

在此处输入图片说明


14

好的。对此似乎有很多麻烦,所以我会给所有方式保留它而不使用该方案的技巧。我将专门介绍iOS模拟器,但也可能需要将其应用于其他目录中的TV Sim。

导致所有这些问题的问题是位于Xcode目录中的plists。Sim启动时,有一个名为configd_sim的进程启动,该进程读取插件并打印调试信息(如果插件指定应记录调试信息)。

撑杆位于此处:

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

如果您正在玩Beta,请注意该目录将有所不同。

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

在此处输入图片说明

从那里,修改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" }}}

祝好运 :]


我先压缩,然后删除,以备恢复之用。
dandan78 '16

1
我发现这无法使很多网络代码静音,可能是因为它缺少子系统名称:2016-09-23 15:09:21.354686 ProductName[8823:191206][] tcp_connection_start 3 starting
BaseZen 2016年

@BaseZen不幸的是,我只解决了OP的问题,该问题不包含任何tcp日志记录问题。如果您需要解决此问题的帮助,则可以创建一个新的SO帖子。
索金彗星2016年

13

这与Xcode 8 Beta发行说明中的日志记录的已知问题有关(也请WWDC的工程师询问)。

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

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

编辑7/5/16:据说从Xcode 8 Beta 2起已修复。

Xcode 8 beta 2-IDE中已解决

调试

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

Xcode 8 Beta 2发行说明


也是这样想,但是我既没有使用watchOS应用程序,也没有使用watchOS模拟器。但是其他模拟市民也可能会遇到这种情况。暂时搁置,看看是否有特定的Xcode 8 Beta在接下来的几周/几个月内会解决它。
汉斯·克诺歇尔(HansKnöchel)2016年

@HansKnoechel既不是我,但我可以确认此问题与任何应用程序一起发生。除了发行说明和WWDC上的一些讨论外,Apple没有其他“官方”字眼。
2016年

谢谢,这里也一样!我们明天应该在WWDC上谈论这件事,呵呵:-)
HansKnöchel16年

我的iPhone 5s模拟器(可能是所有模拟器)也会发生这种情况。
SimplGy

尽管已登录,但我仍无法访问此答案中的链接,但此链接有效:adcdownload.apple.com/WWDC_2016/Xcode_8_beta/…–
SimplGy

7

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

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

调试

•在模拟器中调试应用程序时,Xcode调试控制台不再显示来自系统框架的额外日志记录。(26652255,27331147)


20
在8.1中,我仍然收到大量虚假日志。主要是怪异的套接字和TCP连接的东西。其他人,还是我?
乔丹·史密斯

3
我今天(31/10/2016)刚刚下载了Xcode 8.1,仍然[MC] Reading from private effective user settings.从一个空白的新虚拟项目File> New> Project中看到一些调试日志。
张张

4

Xcode 10中OS_ACTIVITY_MODE具有disable(或default)值的变量也会关闭NSLog无论如何,。

因此,如果您想摆脱控制台噪音而不是自己的日志,则可以尝试使用旧版本printf("")而不是NSLog,因为它不受OS_ACTIVITY_MODE=的影响disable

但是最好在这里检查新的os_logAPI 。


1

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

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

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

要仅过滤您的NSLog语句:

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

这是您应该得到的:

控制台的屏幕截图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.