【问题标题】:Can NSLog be disabled from appearing in device's console? [duplicate]可以禁止 NSLog 出现在设备的控制台中吗? [复制]
【发布时间】:2014-01-24 22:22:21
【问题描述】:

我有一个在设备上运行的已构建应用程序。我在 XCode 的 Organizer 窗口中打开设备的控制台视图。我假设(为了这个问题) NSLog(@"Some string") 被调用。

是否有任何方法(可能是设备或应用程序设置中的一个选项)可以禁止此日志出现在控制台中?

编辑:我对用其他可以达到这种效果的解决方案替换 NSLog 不感兴趣。本题的目的是为了全面了解 NSLog 的功能。

【问题讨论】:

  • 在 google 上搜索 Objective-C DLog。
  • @Wain 如果我的问题的目的是实现这种效果,这将很有用——从控制台隐藏 NSLogs。不是。
  • 这就是它的作用。 NSLog 本身不提供任何选项,因此您需要对其进行一些包装,以便您可以按需禁用日志或为您的发布版本禁用日志。
  • 我不想禁用日志。我想了解他们在理论上是如何被禁用的,所以我会理解为什么他们不应该出现在他们应该出现的时候。
  • 没有设置(据我所知)禁用 NSLog。但是日志最终会打印到stderr,所以关闭或重定向stderr会有这样的效果,下面比较木马的回答。

标签: ios xcode nslog


【解决方案1】:

(感谢@MartinR 鼓励我在这个答案上伸出手指,并正确识别出您不能只关闭标准输出/标准错误,因为下一个open() 将重新使用这些文件描述符,而是重定向标准输出/stderr 给臭名昭著的/dev/null)。

logControl.h:

#pragma once

extern void stopLogging();
extern void startLogging();

logControl.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

static int loggingStopped = 0;
static int oldStdout = -1;
static int oldStderr = -1;

void stopLogging() {
    if (!loggingStopped) {
        oldStdout = dup(1);
        oldStderr = dup(2);

        int devNull = open("/dev/null", O_WRONLY);
        dup2(devNull, 1);
        dup2(devNull, 2);
        close(devNull);

        loggingStopped = 1;
    }
}

void startLogging() {
    if (loggingStopped && oldStdout >= 0 && oldStderr >= 0) {
        dup2(oldStdout, 1);
        close(oldStdout);
        oldStdout = -1;

        dup2(oldStderr, 2);
        close(oldStderr);
        oldStderr = -1;

        loggingStopped = 0;
    }
}

这适用于运行时,而不是编译时,我相信这就是您要问的。只需根据需要致电stopLogging()startLogging()

注意:没有错误检查可言,因此也许可以改进。

【讨论】:

  • 最好使用 dup2() 将标准错误“重定向”到 /dev/null。否则下一个打开的文件将重用这些文件描述符。有关示例,请参见 stackoverflow.com/a/12611692/1187415
  • @MartinR 是的,我认为你是对的。您还必须保存旧的标准输出和标准错误,以防您想重新打开它。没关系 - 这个答案无论如何都不受欢迎;-)
  • 问题可能是不清楚(并且被某些人误解)OP 期望的答案。对我来说,你的似乎最接近一个可能的答案。
  • @MartinR 好的,我会努力的。
【解决方案2】:

在 Xcode 中的 .pch 文件中添加下面给出的这一行。

   #define NSLog(...)

它将禁用所有 NSLog。

更多替代方案见link

【讨论】:

    【解决方案3】:
    #if TARGET_IPHONE_SIMULATOR
    
    //Simulator
    
    #else
    
    // Device
    #define NSLog
    #endif
    

    将此添加到您的 .pch 文件中,这将禁用 NSLog 仅适用于设备而不适用于模拟器。

    【讨论】:

      【解决方案4】:

      将以下代码添加到 .pch 文件中

      #ifdef DEBUG
      #    define NSLog(...) NSLog(__VA_ARGS__)
      #else
      #   define NSLog(...) /* */
      #endif
      

      然后在 Build Settings 中搜索“Preprocessor Macros”,去掉里面写的“DEBUG=1”。

      就是这样,您现在不会在控制台中看到任何日志。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 2011-02-07
        • 2015-03-04
        • 2014-10-22
        • 2015-07-24
        • 2015-11-14
        • 1970-01-01
        相关资源
        最近更新 更多