Можно ли объединить stderr и stdout в C? - PullRequest
3 голосов
/ 03 августа 2011

Мне нужно объединить stderr и stdout, потому что я хочу отладку и исключения в одном и том же файле журнала. Я пытался

    NSString *logPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Tag Monster/log.log"];
    freopen([logPath fileSystemRepresentation], "a", stderr);
    freopen([logPath fileSystemRepresentation], "a", stdout);

но это портит порядок. Он печатает сообщения stderr в верхней части файла. Или есть лучший способ войти в какао? NSLog просто спамит системный журнал: P

Редактировать : Thans мой журнал макрос:

#ifdef DEBUG_MODE_LEVEL_KEEP
#define DLogK(...) (void)printf("%s: %s\n",  __PRETTY_FUNCTION__, [[NSString    stringWithFormat:__VA_ARGS__] UTF8String])
#else
#define DLogK(...)
#endif

Если я просто перенаправлю stderr в файл журнала и войду с помощью

fprintf(stderr, "%s: %s\n",  __PRETTY_FUNCTION__, [[NSString    stringWithFormat:__VA_ARGS__] UTF8String])

тоже не работает. Разве это не должно сработать?

Спасибо

Ответы [ 3 ]

8 голосов
/ 04 августа 2011

Используя dup2() в unistd.h, вы можете закрыть как stderr, так и stdout и перенаправить их в файл.Например:

#include <sys/stat.h> 
#include <stdio.h> 
#include <fcntl.h> 

int log_file;
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;

log_file = open("my_log_file.txt", O_WRONLY | O_CREAT, mode);

if (dup2(log_file, fileno(stderr)) != fileno(stderr) ||
    dup2(log_file, fileno(stdout)) != fileno(stdout))
{
    perror("Unable to redirect output");
}

Теперь и stderr, и stdout при использовании будут писать в my_log_file.txt.Хотя я не уверен насчет iOS, на OSX это должно прекрасно работать.

7 голосов
/ 04 августа 2011

Когда вы запускаете процесс перенаправления stderr в stdout следующим образом:

myprocess 2>&1
0 голосов
/ 03 августа 2011

Вы смотрели на Log4Cocoa ?

...