使用 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 - 从 Xcode 菜单 打开:Product
> Scheme
> Edit Scheme
2 - 在您的 环境变量 上设置 OS_ACTIVITY_MODE
= disable
https://i.stack.imgur.com/p7BlV.png
在 @rustyshelf 的原始 tweet 和 iDevzilla 的图解回答的基础上构建,这是一个解决方案,可以在不禁用设备的 NSLog 输出的情况下消除模拟器的噪音。
在 Product > Scheme > Edit Scheme... > Run (Debug) 下,将 OS_ACTIVITY_MODE 环境变量设置为 ${DEBUG_ACTIVITY_MODE},如下所示:
https://i.stack.imgur.com/TpUsV.png
转到您的项目构建设置,然后单击 + 以添加名为 DEBUG_ACTIVITY_MODE 的用户定义设置。展开此设置并单击“调试”旁边的 + 以添加特定于平台的值。选择下拉菜单并将其更改为“任何 iOS 模拟器”。然后将其值设置为“禁用”,如下所示:
https://i.stack.imgur.com/9Eumr.png
disable
替换为 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 现在在大多数情况下只是 os_log 的一个垫片。
现在只有引用另一个 env 变量的源才有意义。完全不同的地方,这次来自 Apple 内部。不知道为什么它们重叠。 [删除了关于 NSLog
的错误评论]
[编辑于 9 月 22 日]:我想知道“发布”和“流”与“调试”有何不同。来源不够。
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;
}
}
os_log
非正式地称为新的 Kool Aid。
一条推文为我提供了答案 - https://twitter.com/rustyshelf/status/775505191160328194
要阻止 Xcode 8 iOS 模拟器疯狂记录,请在调试方案中设置环境变量 OS_ACTIVITY_MODE = disable。
有效。
disable
替换为 default
。
请找到以下步骤。
选择 Product => Scheme => Edit Scheme 或使用快捷方式:CMD + < 从左侧选择 Run 选项。在环境变量部分,添加变量 OS_ACTIVITY_MODE = disable
有关更多信息,请查看以下 GIF 表示。
https://i.stack.imgur.com/vv2R8.gif
disable
替换为 default
。
对我来说,这在 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 调试控制台在模拟器中调试应用程序时显示来自系统框架的额外日志记录。 (27331147, 26652255)
据推测,这将通过 GM 版本解决。在那之前要有耐心,虽然不理想,但我正在使用的解决方法如下......
与之前的答案类似,我必须:
在我的打印日志前加上某种特殊字符(例如 * 或 ^ 或 ! 等)
然后使用控制台窗格右下角的搜索框通过输入我选择的特殊字符来过滤我的控制台日志,以使控制台按预期显示我的打印日志
https://i.stack.imgur.com/UvIry.png
我的解决方案是在断点中使用调试器命令和/或日志消息。
https://i.stack.imgur.com/Je9HQ.png
并将控制台的输出从所有输出更改为调试器输出,如
https://i.stack.imgur.com/IAxru.png
好吧。关于这个似乎有很多骚动,所以我会给你们一种方法来坚持它而不使用那个方案技巧。我将专门针对 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。现在,构建并运行您的应用程序并观察日志。您正在寻找紧跟子系统的内容:part。紧随其后的名称代表相应的有问题的 plist。
https://i.stack.imgur.com/QcyAt.png
从那里,要么修改 plist 以删除调试 [Level] 键/值,这是一个包含 "Enable" => "Default"
键/值的字典......或者只是简单地删除 plist。请注意,您需要成为 root 才能执行这些操作,因为它们位于 Xcode 应用程序中。
plutil -p
命令也可能对您有用。 IE
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" }}}
祝你好运 :]
2016-09-23 15:09:21.354686 ProductName[8823:191206][] tcp_connection_start 3 starting
这与在 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.1 (已测试版本 8.1 beta (8T46g))中不再是问题。您可以从方案中删除 OS_ACTIVITY_MODE
环境变量。
https://developer.apple.com/go/?id=xcode-8.1-beta-rn
调试 • 在模拟器中调试应用程序时,Xcode 调试控制台不再显示来自系统框架的额外日志。 (26652255, 27331147)
[MC] Reading from private effective user settings.
。新 >项目。
在 Xcode 10 中,具有 disable
(或 default
)值的 OS_ACTIVITY_MODE
变量也无论如何都会关闭 NSLog
。
因此,如果您想摆脱控制台噪音而不是您自己的日志,您可以尝试使用旧的 printf("")
而不是 NSLog,因为它不受 OS_ACTIVITY_MODE
= disable
的影响。
但最好查看新的 os_log
API here。
请注意,对于 iOS 14 模拟器,OS_ACTIVITY_MODE=disable 不会使用新的 Swift Logger 显示任何日志。您必须删除或启用它。
我阅读了所有解决方案,到目前为止没有任何效果,在编写此响应时我正在使用 XCODE 12.5,这是在调试器中看到的最烦人的事情,其中包含大量不需要的消息。
我所做的解决方案比最复杂的解决方案要简单得多,这是我为解决这个烦人的问题所做的:
无需使用任何环境变量等,否则按照之前的帖子的建议使用这些会禁用 NSLOG 输出,这在这种情况下不是您想要的。我确保我所有的 NSLOG 都包含一个我稍后会监控的字符串,例如:
以前我曾经这样做:
NSLog(@"Hello World");
现在,我这样做:
NSLog(@"[Admin]: Hello World");
而“[Admin]”是我的程序的名称(或您喜欢的任何字符串,除了 [Admin]”
(可选步骤)或(更简单),我编写了一个函数来将(嗯;代理)NSLog 引导到另一个全局函数“Log”,而我所有的日志都将转到该函数,然后 Log 函数将附加“[Admin] " 将字符串添加到原始日志记录字符串,并添加日志记录时间和我需要的其他项目等(类似于 WebLogic 或任何其他 JAVA 日志记录),这样可以确保所有日志都遵循一个标准。 ...这是百万美元的核武器:
现在,进入您的调试器窗口,在底部您将看到一个“搜索”窗口,它显示“过滤器”,输入您的字符串(例如;“[Admin]”),按 ENTER 键,工作完成。
这样,你只会看到你喜欢看的线条,
https://i.stack.imgur.com/KPYqD.jpg
当您想过滤掉其他组件时也很有用,例如,对于网络通信,我使用更多的字符串,我可以稍后过滤。
换句话说,与您的应用程序无关的烦人日志行将始终存在,但您选择不使用上述命令查看它们,我希望这可以解决问题。
希望大家都有美好的一天。
H
这个解决方案一直为我工作:
在模拟器中运行应用打开系统日志(⌘ + /)
这将转储所有调试数据以及您的 NSLog。
要仅过滤您的 NSLog 语句:
用符号前缀每个,例如: NSLog(@"^ Test Log") 使用右上角的搜索框过滤结果,“^”在上面的情况下
这是你应该得到的:
https://i.stack.imgur.com/HbqrI.png
NSLog
...