18

OSXでココアアプリケーションを実行しています。デバッグ目的で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ファイルにリダイレクトされます。このファイルはdocumentsディレクトリにあります。

于 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に興味があるかもしれません。これは、MacOSXとiOSの両方に対応する非常に柔軟なロギングフレームワークです。1つのロギングステートメントをコンソールだけでなくファイルにも同時に送信できます。さらに、実際にはNSLogよりも高速です。OSXとiOSの両方に共通のコードがあるプロジェクトで使用しています。

于 2012-01-21T21:56:09.520 に答える
-9

NSLogコンソールにログインします。独自の関数などを定義し、出現するMyLogすべてのをに置き換える必要があります。NSLogMyLog

于 2010-07-06T19:55:02.477 に答える