【问题标题】:Write the XCode output into a file [duplicate]将XCode输出写入文件[重复]
【发布时间】:2014-06-26 10:18:06
【问题描述】:

我希望 XCode 输出(来自 NSLog() 或其他)自动写入应用程序文件夹中的文件。也就是说,我只想把XCode区的全部内容调试成一个文本文件。

我看到了一些代码 sn-ps,但它们中的每一个都避免显示到 XCode(这是不可接受的)。我只想将调试文本复制到文件中...有没有办法做到这一点?

EDIT 1(在尝试了 Clement 的回答之后):

我得到一个链接器错误:

EDIT 2(我如何实现克莱门特的回答):

我创建了一个名为 LogHelper 的新类:

LogHelper.h

#define NSLog(args...) _Log(@"DEBUG ", __FILE__,__LINE__,__PRETTY_FUNCTION__,args);
@interface MyCustomLog : NSObject
void _Log(NSString *prefix, const char *file, int lineNumber, const char *funcName, NSString *format,...);
@end

LogHelper.m

#import "LogHelper.h"

@implementation MyCustomLog : NSObject

void append(NSString *msg){
    // get path to Documents/somefile.txt
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"myCustomLog.txt"];
    // create if needed
    if (![[NSFileManager defaultManager] fileExistsAtPath:path]){
        fprintf(stderr,"Creating file at %s",[path UTF8String]);
        [[NSData data] writeToFile:path atomically:YES];
    }
    // append
    NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:path];
    [handle truncateFileAtOffset:[handle seekToEndOfFile]];
    [handle writeData:[msg dataUsingEncoding:NSUTF8StringEncoding]];
    [handle closeFile];
}

void _Log(NSString *prefix, const char *file, int lineNumber, const char *funcName, NSString *format,...) {
    va_list ap;
    va_start (ap, format);
    format = [format stringByAppendingString:@"\n"];
    NSString *msg = [[NSString alloc] initWithFormat:[NSString stringWithFormat:@"%@",format] arguments:ap];
    va_end (ap);
    fprintf(stderr,"%s%50s:%3d - %s",[prefix UTF8String], funcName, lineNumber, [msg UTF8String]);
    append(msg);
}
@end

我在myApplication-Prefix.pch 中添加了#import "LogHelper.h"

EDIT 3(我找到了解决方案):

  • 我设置了一个名为“runningFromXCode”(follow this link to see how to do it) 的环境变量,以在应用从 XCode 运行时保持调试文本显示在控制台中;

  • 我把这段代码写进了application:didFinishLaunchingWithOptions:方法(source):

    if (getenv("runningFromXCode") == NULL){
        NSArray *allPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [allPaths objectAtIndex:0];
        NSString *pathForLog = [documentsDirectory stringByAppendingPathComponent:@"log.txt"];
    
        freopen([pathForLog cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
    }
    

【问题讨论】:

  • 您希望在调试期间将其写入应用程序包?馊主意;选择其他地方。
  • 但无论如何dup2() 可能就是你要找的...
  • @trojanfoe 您无法写入应用程序包中的文件。它是只读的,因为捆绑目录是使用 SSL 证书签名的代码
  • @Clement 我在哪里说你可以做到这一点?

标签: ios xcode cocoa ios7


【解决方案1】:
#define NSLog(args...) _Log(@"DEBUG ", __FILE__,__LINE__,__PRETTY_FUNCTION__,args);
    @interface MyCustomLog : NSObject
    void _Log(NSString *prefix, const char *file, int lineNumber, const char *funcName, NSString *format,...);
    @end

    @implementation MyCustomLog
    void append(NSString *msg){
        // get path to Documents/somefile.txt
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"myCustomLog.txt"];
        // create if needed
        if (![[NSFileManager defaultManager] fileExistsAtPath:path]){
            fprintf(stderr,"Creating file at %s",[path UTF8String]);
            [[NSData data] writeToFile:path atomically:YES];
        }
        // append
        NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:path];
        [handle truncateFileAtOffset:[handle seekToEndOfFile]];
        [handle writeData:[msg dataUsingEncoding:NSUTF8StringEncoding]];
        [handle closeFile];
    }

    void _Log(NSString *prefix, const char *file, int lineNumber, const char *funcName, NSString *format,...) {
        va_list ap;
        va_start (ap, format);
        format = [format stringByAppendingString:@"\n"];
        NSString *msg = [[NSString alloc] initWithFormat:[NSString stringWithFormat:@"%@",format] arguments:ap];
        va_end (ap);
        fprintf(stderr,"%s%50s:%3d - %s",[prefix UTF8String], funcName, lineNumber, [msg UTF8String]);
        append(msg);
    }
    @end

stackoverflow.com/questions/7271528/how-to-nslog-into-a-file

【讨论】:

  • 此代码取自以下问题,不注明出处:stackoverflow.com/questions/7271528/how-to-nslog-into-a-file
  • @trojanfoe 感谢您的链接。我在一个项目中使用它,但找不到源代码。答案随属性更新
  • 请看我编辑的问题。
  • @Erzékiel 相同的代码对我有用。你能用你是如何实现和使用 MyCustomLog 调用来更新你的问题吗?
  • @Clement 抱歉耽搁了,请参阅编辑 2。
猜你喜欢
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 2012-11-01
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
相关资源
最近更新 更多