Jak przekierować wyjście nslog do pliku zamiast konsoli

Mam aplikację cocoa działającą na OS X. używałem NSLog do debugowania. Teraz chcę przekierować instrukcje log do pliku zamiast konsoli.

Użyłem tej metody, ale powoduje to logowanie zarówno w konsoli, jak i w pliku.

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

Czy jest możliwe, aby nie mieć instrukcji log w konsoli, a tylko w pliku ??

Author: Unicorn, 2010-07-06

4 answers

NSLog służy do logowania się do konsoli. Musisz zdefiniować własną funkcję MyLog lub cokolwiek innego i zamienić wszystkie wystąpienia NSLog na MyLog.

 -7
Author: Yuji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 19:55:02

Krok 1: Dołącz następującą funkcję w 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);
 }

Krok 2: wywołanie tej funkcji na początku funkcji applicationDidFinishLaunchingWithoptions...

To wszystko, każda NSLog () zostanie teraz przekierowana do tej konsoli.plik dziennika, który znajdziesz w katalogu documents.

 64
Author: Yuji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-09 17:35:45

Ostatnio spotkałem się z podobnym wymogiem i tak to zrobiłem.

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

A teraz jeśli chcesz tę konsolę do użytkownika

-(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
Author: user1227928,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-24 07:54:20

Może Cię zainteresować CocoaLumberjack. Jest to bardzo elastyczna struktura rejestrowania zarówno dla Mac OS X, jak i iOS. Jedna instrukcja logging może być wysłana nie tylko do konsoli, ale do pliku jednocześnie. Plus jest faktycznie szybszy niż NSLog. Używam go w projekcie, który ma wspólny kod zarówno dla OS X, jak i iOS.

 3
Author: dbainbridge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-21 21:56:09