是否可以在 C 中合并 stderr 和 stdout?

发布于 2024-11-27 21:58:59 字数 845 浏览 0 评论 0原文

我需要合并 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情绪失控 2024-12-04 21:58:59

unistd.h 中使用 dup2(),您可以关闭 stderrstdout 并将它们重定向到一个文件。例如:

#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");
}

现在 stderrstdout 在使用时都会写入 my_log_file.txt。虽然我不确定 iOS 的情况,但它在 OSX 上应该可以正常工作。

Using dup2() in unistd.h, you could close both stderr and stdout and re-direct them to a file. For instance:

#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");
}

Now both stderr and stdout, when used, will write to my_log_file.txt. While I'm not sure about iOS, this should work perfectly fine on OSX.

丢了幸福的猪 2024-12-04 21:58:59

当您运行进程时,将 stderr 重定向到 stdout,如下所示:

myprocess 2>&1

When you run the process redirect stderr to stdout like this:

myprocess 2>&1
南风起 2024-12-04 21:58:59

您看过 Log4Cocoa 吗?

Did you have a look at Log4Cocoa?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文