首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将nslog输出重定向到文件而不是控制台

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

Stack Overflow用户
提问于 2010-07-06 15:15:26
回答 4查看 18.9K关注 0票数 18

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

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

代码语言:javascript
复制
- (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;
}

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-07 03:55:02

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

票数 -9
EN

Stack Overflow用户

发布于 2011-05-09 22:07:13

步骤1:在AppDelegate中包含以下函数:

代码语言:javascript
复制
 - (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文件,您可以在documents目录中找到该文件。

票数 69
EN

Stack Overflow用户

发布于 2014-12-24 15:54:21

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

代码语言:javascript
复制
- (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);
} 

现在,如果您想要将此控制台连接到用户

代码语言:javascript
复制
-(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;
    }

}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3184235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档