How to redirect the nslog output to file instead of console
Step 1: Include following function in AppDelegate:
- (void) redirectConsoleLogToDocumentFolder { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"]; freopen([logPath fileSystemRepresentation],"a+",stderr); }
Step 2: Call this function at the start of function applicationDidFinishLaunchingWithOptions...
Thats it, Every NSLog() will now get redirected to this console.log file, which you can find in the documents directory.
Recently i have faced similar requirement and this is how i have done it.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ // Override point for customization after application launch. [self redirectConsoleLogToDocumentFolder]; return YES;}- (void) redirectConsoleLogToDocumentFolder{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.txt"]; freopen([logPath fileSystemRepresentation],"a+",stderr);}
And Now if you want to this console to user
-(void)displayLog{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths firstObject]; NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.txt"]; NSError *err = nil; NSString *fileContents = [NSString stringWithContentsOfFile:logPath encoding:NSUTF8StringEncoding error:&err]; if (fileContents == nil) { NSLog(@"Error reading %@: %@", logPath, err); } else { self.textView.text = fileContents; }}
You may be interested in CocoaLumberjack. It is a very flexible logging framework for both Mac OS X and iOS. One logging statement can be sent not only to the console but to a file simultaneously. Plus it is actually faster then NSLog. I use it in a project that has common code for both OS X and iOS.