我需要合并stderr和stdout,因为我希望我的调试和同一日志文件中的异常。我试过了
NSString *logPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Tag Monster/log.log"];
freopen([logPath fileSystemRepresentation], "a", stderr);
freopen([logPath fileSystemRepresentation], "a", stdout);
但这会扰乱秩序。它会在文件顶部打印stderr消息。 或者有更好的方法登录可可吗? NSLog只是阻塞了syslog:P
修改: 解冻我的日志宏:
#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])
它也不起作用。这不应该只是工作吗?
由于
答案 0 :(得分:8)
在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上完全正常。
答案 1 :(得分:7)
当您运行该过程时,将stderr重定向到stdout,如下所示:
myprocess 2>&1
答案 2 :(得分:0)
你看过Log4Cocoa了吗?