是否可以在 C 中合并 stderr 和 stdout?
我需要合并 stderr 和 stdout,因为我希望调试和异常位于同一个日志文件中。我尝试过,
NSString *logPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Tag Monster/log.log"];
freopen([logPath fileSystemRepresentation], "a", stderr);
freopen([logPath fileSystemRepresentation], "a", stdout);
但这打乱了顺序。它在文件顶部打印 stderr 消息。 或者有没有更好的登录可可的方法? NSLog 只是向系统日志发送垃圾邮件: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])
它进行日志记录也不起作用。这不应该有效吗?
谢谢
I need to merge stderr and stdout because I want my debug and the exceptions in the same log file. I tried
NSString *logPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Tag Monster/log.log"];
freopen([logPath fileSystemRepresentation], "a", stderr);
freopen([logPath fileSystemRepresentation], "a", stdout);
but this messes up the order. It prints the stderr messages at the top of the file.
Or is there a better way to log in cocoa? NSLog just spams the syslog :P
Edit:
Thants my log macro:
#ifdef DEBUG_MODE_LEVEL_KEEP
#define DLogK(...) (void)printf("%s: %s\n", __PRETTY_FUNCTION__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String])
#else
#define DLogK(...)
#endif
If I just redirect stderr to a logfile and log with
fprintf(stderr, "%s: %s\n", __PRETTY_FUNCTION__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String])
it does not work either. Shouldn't that just work?
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在
unistd.h
中使用dup2()
,您可以关闭stderr
和stdout
并将它们重定向到一个文件。例如:现在
stderr
和stdout
在使用时都会写入 my_log_file.txt。虽然我不确定 iOS 的情况,但它在 OSX 上应该可以正常工作。Using
dup2()
inunistd.h
, you could close bothstderr
andstdout
and re-direct them to a file. For instance:Now both
stderr
andstdout
, when used, will write to my_log_file.txt. While I'm not sure about iOS, this should work perfectly fine on OSX.当您运行进程时,将 stderr 重定向到 stdout,如下所示:
When you run the process redirect stderr to stdout like this:
您看过 Log4Cocoa 吗?
Did you have a look at Log4Cocoa?