ChatGPT解决这个技术问题 Extra ChatGPT

隐藏奇怪的不需要的 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

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

似乎只是调试遗留下来的开发日志信息。正在调查...
您是否关闭了 xcode 中的动态链接器 api 使用?
在 Xcode 8 中似乎不适合我,这个解决方案仅适用于 Xcode 8 beta。
我仍然在 Xcode 9.3 上看到这个问题,我已经提交了 Apple Bug #34767176(Xcode 9 Displays System Framework Debug Print Statements),这是打开的错误 #32256894 的副本 请向 Apple 提交该错误的副本: bugreport.apple.com/web

S
SwiftiSwift

尝试这个:

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

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

https://i.stack.imgur.com/p7BlV.png


它也适用于 Xcode 8.0 版本,所以我建议它是解决方案。
对于任何想知道如何进入该屏幕的人,您需要转到 Product > Scheme > Edit Scheme 或 Cmd + <
@iDevzilla,此解决方案存在一些问题,它在使用真实设备时从日志中删除了一些重要内容,例如自我记录的数据。请再次概述它,我不确定它是否是最理想的解决方案。
不幸的是,这个选项对我来说隐藏了真实设备中的所有NSLog...
该问题仅在模拟器中存在。我个人认为添加环境变量不是一个好主意,因为它还隐藏了重要的日志,例如布局约束问题以及@AirXygène 给出的示例。在模拟器中你也可以点击“CMD + /”打开控制台,它会给你老式的日志。不过,希望 Apple 会在 Xcode 中解决这个问题,这会引起很多人关注点赞的数量;)
E
Elijah

在 @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


@NSNoob 确保您在 env 变量中没有空格。
太糟糕了,这不是公认的答案,太糟糕了,这个答案正在失去投票计数。更好的答案恕我直言,因为它仅禁用 OS_ACTIVITY_MODE 以在模拟器上构建 DEBUG。
这对我不起作用,投票最多的答案也没有。在 OS X 10.11.6 El Capitan 上使用 Xcode 8.2.1。但是起作用的是这个答案和 BaseZen 的答案的结合,使用 OS_ACTIVITY_DT_MODE 而不是 OS_ACTIVITY_MODE。 (出乎我意料的是,至少“否”和“禁用”都关闭了猖獗的日志记录。)
@RenniePet,这正是我所做的。谢谢!
此解决方案将隐藏从 Xcode 9 开始的所有 NSLog。要保留 NSLog,请将 disable 替换为 default
B
BaseZen

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 日]:我想知道“发布”和“流”与“调试”有何不同。来源不够。

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

总是很高兴看到提供原因和背景的答案,而不仅仅是快速修复。
使用 OS_ACTIVITY_DT_MODE = NO 解决了这个问题
这会产生与 OS_ACTIVITY_MODE=disable 不同的行为吗?有什么理由更喜欢这个解决方案吗?
它不是。它隐藏了这一切。
@Frizlab 是的,我在帖子中都提到了这两个。参见“OR”...我将 os_log 非正式地称为新的 Kool Aid。
P
Peter Smith

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

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

有效。


如前所述: OS_ACTIVITY_MODE = disable 会停用所有其他使用 NSLog 的日志记录。
此解决方案将隐藏从 Xcode 9 开始的所有 NSLog。要保留 NSLog,请将 disable 替换为 default
R
Ramkrishna Sharma

请找到以下步骤。

选择 Product => Scheme => Edit Scheme 或使用快捷方式:CMD + < 从左侧选择 Run 选项。在环境变量部分,添加变量 OS_ACTIVITY_MODE = disable

有关更多信息,请查看以下 GIF 表示。

https://i.stack.imgur.com/vv2R8.gif


等等....在第二次运行时它起作用了。感谢 Gif 视频。最好的答案总是在底部!
此解决方案将隐藏从 Xcode 9 开始的所有 NSLog。要保留 NSLog,请将 disable 替换为 default
@Cœur 你是救世主,每个人都说禁用它,但你给了我最好的答案,非常感谢。
C
Community

对我来说,这在 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


@SimplyLearning 你会在推特上找到这些信息。但是您可以查看 Apple 的官方网站:developer.apple.com/news 或他们的新闻源以在他们发布它们时获取更新:developer.apple.com/news/rss/news.rss 顺便说一句:这似乎仍然是 Xcode Beta 3 中的一个问题。
刚拿到Xcode 8 GM,问题依旧。很烦人!!
刚刚从 App Store 下载了 Xcode 版本 8.0 (8A218a)。问题仍然存在。
简直荒谬。在最终 MAS 版本中仍然存在。
我们使用标签前缀进行过滤。一些问题是: 多行只会显示第一行。使用 lldb 进行调试时,需要切换过滤。真的很遗憾,截至今天,控制台非常有限。我们有一个适合过滤的应用程序,但我们需要从控制台复制/粘贴。多么悲伤。
m
mrahmiao

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

https://i.stack.imgur.com/Je9HQ.png

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

https://i.stack.imgur.com/IAxru.png


S
Sozin's Comet

好吧。关于这个似乎有很多骚动,所以我会给你们一种方法来坚持它而不使用那个方案技巧。我将专门针对 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
@BaseZen 不幸的是,我只解决了不包含任何 tcp 日志记录问题的 OPs 问题。如果您需要帮助解决此问题,您可以创建一个新的 SO 帖子。
J
JAL

这与在 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


我也这么想,但我既没有使用 watchOS 应用程序,也没有使用 watchOS 模拟器。但它仍然可能发生在其他模拟人生身上。暂时搁置,看看某个 Xcode 8 Beta 是否会在接下来的几周/几个月内修复它。
@HansKnoechel 我也不是,但我可以确认任何应用程序都会出现此问题。除了发布说明和 WWDC 上的一些讨论外,Apple 没有任何“官方”字眼。
谢谢,这里也一样!我们应该在明天的 WWDC 期间讨论这个问题,呵呵 :-)
我的 iPhone 5s 模拟器也会发生这种情况,可能是所有模拟器。
尽管已登录,但我无法访问此答案中的链接,但此链接有效:adcdownload.apple.com/WWDC_2016/Xcode_8_beta/…
m
mriddle89

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

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

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


在 8.1 中,我仍然收到很多虚假登录。主要是奇怪的套接字和 tcp 连接的东西。其他人,还是只有我?
我今天(2016 年 10 月 31 日)刚刚下载了 Xcode 8.1,但仍然从一个空白的新虚拟项目文件中看到一些调试日志,例如 [MC] Reading from private effective user settings.。新 >项目。
J
Jakub Truhlář

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

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

但最好查看新的 os_log API here


S
StackUnderflow

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


H
Heider Sati

我阅读了所有解决方案,到目前为止没有任何效果,在编写此响应时我正在使用 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


p
psobko

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

在模拟器中运行应用打开系统日志(⌘ + /)

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

要仅过滤您的 NSLog 语句:

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

这是你应该得到的:

https://i.stack.imgur.com/HbqrI.png