将XCode输出写入文件

时间:2014-06-26 10:18:07

标签: ios xcode cocoa ios7

我希望XCode输出(来自NSLog()或其他)自动写入应用程序文件夹中的文件。换句话说,我只想看到XCode区域的整个内容调试成文本文件。

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

编辑1 (在尝试克莱门特的答案后):

我收到链接器错误: enter image description here

编辑2 (我如何实施Clement的答案):

我创建了一个名为 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

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

编辑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);
    }
    

1 个答案:

答案 0 :(得分: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