如何将nslog输出重定向到文件而不是控制台

Uni*_*orn 17 macos xcode cocoa nslog

我在OS X上运行了cocoa应用程序.我已经使用NSLog进行调试.现在我想将日志语句重定向到文件而不是控制台.

我已经使用过这种方法,但它会导致在Console和文件中记录.

- (BOOL)redirectNSLog
{
    // Create log file
    [@"" writeToFile:@"/NSLog.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    id fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/NSLog.txt"];
    if (!fileHandle)    return NSLog(@"Opening log failed"), NO;
    [fileHandle retain];

    // Redirect stderr
    int err = dup2([fileHandle fileDescriptor], STDERR_FILENO);
    if (!err)   return  NSLog(@"Couldn't redirect stderr"), NO;

    return  YES;
}
Run Code Online (Sandbox Code Playgroud)

是否有可能在控制台中没有日志语句但只能在文件中?

小智 66

第1步:在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);
 }
Run Code Online (Sandbox Code Playgroud)

第2步:在函数applicationDidFinishLaunchingWithOptions的开头调用此函数...

多数民众赞成,每个NSLog()现在都会被重定向到这个console.log文件,你可以在文件目录中找到它.

  • 绝对是比我更好的答案:)将`cStringWithEncoding:NSASCII ...`改为`fileSystemRepresentation`.人们可以在路径中使用非ASCII字母(在〜/ Documents /`中不太可能) (3认同)
  • 你能解释为什么这个流来自stderr (3认同)
  • 为什么在freopen中使用stderr而不是stdout? (3认同)

use*_*928 12

最近我遇到了类似的要求,这就是我如何做到的.

- (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);
} 
Run Code Online (Sandbox Code Playgroud)

现在,如果你想要这个控制台用户

-(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;
    }

}
Run Code Online (Sandbox Code Playgroud)


Yuj*_*uji -9

NSLog使登录到控制台。您需要定义自己的函数MyLog或其他函数,并将所有出现的 替换NSLogMyLog