将NSLog写到文件

在pch文件中加入如下代码,重定义NSLog   输出格式为:文件名(行号) 打印信息

#ifdef DEBUG

#  define NSLog(fmt, ...) do {                                            \
NSString* file = [[NSString alloc] initWithFormat:@"%s", __FILE__]; \
NSLog((@"%@(%d) " fmt), [file lastPathComponent], __LINE__, ##__VA_ARGS__); \
[file release];                                                 \
} while(0)
#else

# define NSLog(...);


在application didFinishLaunchingWithOptions:中的第一行,加入如下三种方法的任意一个,即可将打印信息定向输入到文件

方法1, freopen([@"/tmp/my_logs.txt" fileSystemRepresentation], "w", stderr);  其中,第一个参数为日志文件的路径和文件名,可以由你自己设置,注意,这里存到了系统根目录下的tmp下。


方法2, [self redirectNSLog];

在appDelegate中定义如下方法:

- (BOOL)redirectNSLog {
    // Create log file
    [@"" writeToFile:@"/NSLog.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    id fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/NSLog.txt"];
    if (!fileHandle)
        NSLog(@"Opening log failed");
        return  NO;
    [fileHandle retain];
    
    // Redirect stderr
    int err = dup2([fileHandle fileDescriptor], STDERR_FILENO);
    if (!err)
        NSLog(@"Couldn't redirect stderr");
        return NO;
    return YES;
}



方法3, [self redirectNSLogToDocumentFolder];

在AppDelegate中定义如下方法:

- (void)redirectNSLogToDocumentFolder{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *fileName =[NSString stringWithFormat:@"%@.log",[NSDate date]];
    NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName];
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
}

通过以上操作,通过打开或注释application didFinishLaunchingWithOptions:中的那一句话,即可以决定将日志写入文件还是输入到控制台。

你可能感兴趣的:(将NSLog写到文件)