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

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

也许有人已经找到了一个配置来处理这个?

224433 次浏览

这与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发行说明

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

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

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

要仅过滤您的NSLog语句:

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

这是你应该得到的:

控制台截图

对于我来说,这在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-从xcode菜单打开:Product>Scheme>Edit Scheme

2-在您的环境变量集合上OS_ACTIVITY_MODE=disable

截图

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

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

它奏效了。

好的。关于这个似乎有很多骚动,所以我将给你们一个方法来坚持它,而不使用那个方案技巧。我将具体解决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

如果您正在使用beta,请注意dir会有所不同。

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

在此处输入图像描述

从那里,要么修改plist以删除调试[Level]键/值,这是一个包含"Enable" => "Default"键/值的字典…或者只是简单地删除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”(主答案中的模式截图中解释的GUI方法)使其对我有效。

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

喝新的Kool-aid:http://asciiwwdc.com/2016/sessions/721https://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;
}
}

基于来自@rusty的原始推文和来自iDevzilla的插图答案,这里有一个解决方案,可以在不禁用设备NSLog输出的情况下消除模拟器的噪声。

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

在此处输入图片描述

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

在此处输入图片描述

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

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

调试

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

请执行以下步骤。

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

欲了解更多信息,请参阅下面的GIF表示。

编辑方案

xcode 10中,具有disable(或default)值的OS_ACTIVITY_MODE变量也会关闭NSLog

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

但是最好看看新的os_log API这里

请注意,对于iOS14模拟器,OS_ACTIVITY_MODE=disable不会显示使用新的Swift Logger的任何日志。您必须删除或启用它。

我阅读了所有的解决方案,到目前为止没有任何效果,我在写这个响应时使用的是XCODE 12.5,这是在调试器中看到的最令人讨厌的事情,它有如此堆积/泛滥的不需要的消息。

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

  1. 不需要使用任何环境变量等,否则按照历史发文的建议使用这些会禁用NSLOG输出,这不是你想要的。

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

以前我经常做:

NSLog(@"Hello World");

现在,我做:

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

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

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

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

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

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

输入图片描述

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

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

希望对所有人来说都是美好的一天。

H