【问题标题】:storing logs/error message on C programming在 C 编程中存储日志/错误消息
【发布时间】:2013-04-13 12:38:57
【问题描述】:

当发生错误时,我希望我的 C 代码在退出程序之前存储错误。是否建议将stderr 存储到文件中(例如,/home/logs.txt),还是建议使用不同的方法来保存日志/错误报告(考虑到编程环境是Linux)。例如,对于下面的代码,我如何应用该方法将日志/错误消息存储在 /home/log.txt/home/log

FILE *fp1;
fp1 = fopen("/sys/class/gpio/export","w"); 
if(fp1 == NULL){
    fprintf(stderr, "errno:%s - opening GPIO136 failed - line 739\n ", strerror(errno));
    close(fp1);
    exit(1);
}

谢谢。

【问题讨论】:

  • close() 的调用是错误的,因为它用于文件描述符而不是文件句柄。您应该在此处收到编译器警告/错误,因为您将指针传递到预期整数的位置。但是调用fclose() 将是多余的,因为文件尚未打开,这由fp1 表示为NULL
  • 谢谢你,我会在我的代码上修复它

标签: c linux error-handling posix stderr


【解决方案1】:

如果stderr 总是用于打印出所有错误信息,那么,您可以将输出重定向到特定文件。

$ program 2>~/logs.txt

要获得更好的日志记录工具,您可以使用:

【讨论】:

  • syslog 不是系统调用(它不在man 页面的第 2 部分中)而是标准库函数。我建议使用它。
【解决方案2】:

如果您想存储错误,stderr 可能不是一个好的选择,因为您每次运行程序时都需要通过管道将 stderr 传输到文件中。

如果您想写入 /home/log.txt,请打开指向它的 FILE 指针并使用 fprintf 写入,就像您尝试打开 /sys/class/gpio/export 并写入该文件而不是 stderr 一样。还要确保以附加模式打开日志文件。

FILE *fp1;
fp1 = fopen("/sys/class/gpio/export","w"); 
if(fp1 == NULL){
   FILE *fpErr = fopen("/home/log.txt", "a");
   if(fpErr != NULL)
      fprintf(fpErr, "errno:%s - opening GPIO136 failed - line 739\n ", strerror(errno));
   close(fpErr);
   close(fp1);
   exit(1);
}

【讨论】:

    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多