18

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

我使用过这种方法,但它会导致在控制台和文件中登录。

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

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

4

4 回答 4

69

第 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);
 }

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

就是这样,现在每个 NSLog() 都将被重定向到这个 console.log 文件,您可以在文档目录中找到该文件。

于 2011-05-09T14:07:12.950 回答
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);
} 

现在,如果您想将此控制台提供给用户

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

}
于 2014-12-24T07:54:20.867 回答
3

您可能对CocoaLumberjack感兴趣。它是一个非常灵活的日志框架,适用于 Mac OS X 和 iOS。一个日志记录语句不仅可以发送到控制台,还可以同时发送到文件。此外,它实际上比 NSLog 更快。我在一个具有 OS X 和 iOS 通用代码的项目中使用它。

于 2012-01-21T21:56:09.520 回答
-9

NSLog登录到控制台。您需要定义自己的函数MyLog或其他任何内容,并替换所有出现的NSLoginto MyLog

于 2010-07-06T19:55:02.477 回答