c - C 中的共享日志文件 - 如何?

标签 c logging global

我有一个由多个 C 文件(display.cpp、main.cpp,...)组成的项目。我想要一个日志文件,我可以从组成该项目的各种程序中写入该日志文件。如何实现和引用全局可访问的文件?我是 C 新手,但我知道如何在单个文件的上下文中定义和使用(打开、读取、写入、关闭)文件。但如何实现可共享文件呢?

例如,这里需要什么样的声明才能使文件全局可访问(即,将其设置为全局可访问)。该声明如何传播到将访问该日志文件的其他文件。我是否将声明和/或相关语句放入将写入日志的每个文件都包含的头文件中?我认为会有一个相当简单、基本的答案。我意识到事情可以通过许多替代方式来完成。我只是想实现基本功能。它是我想要实现的日志文件应该是无关紧要的。我只想要一个共享的可写文件。

我是否只需打开日志文件,写入它,然后立即关闭该文件,并在每次要写入日志文件时重复打开/写入(追加)/关闭过程,如下面的代码所示。看起来开销很大。我想我可以将所有这些代码放在一个函数中,我调用该函数将数据写入日志文件。我对开销的看法正确吗?这听起来像使用的方法吗?

FILE *myfile2;
errno_t errorCode = fopen_s(&myfile2, "C://Users/richard/Desktop/cTestbed2015/test22.txt", "a");
if (myfile2== NULL)
{
    printf("myfile2 does not exist \n");
}
fprintf(myfile2, "Posting from readfile.cpp\n");
fclose(myfile2);

最佳答案

“我是否将声明和/或相关语句放入将写入日志的每个文件都包含的头文件中?”

这是一个非常简单的解决方案。在任意源文件中实例化您的 FILE* myLogFile 变量并将其初始化为 NULL。

什么时候打开文件?您可以在 main 中打开它,或者可能更好,编写一个 getter 函数 getLogFile() 来检查 myLogFile 是否为 NULL,然后打开它。要使对日志文件的所有访问都通过此函数,请不要在头文件中声明 FILE 变量,而只声明 getter 函数。然后,您将 FILE 变量存储为 getter 函数内的静态变量,而不是全局变量:

FILE* getLogFile()
{ static FILE* myLogFile = NULL;
  if(myLogFile == NULL)
  { myLogFile = fopen(...);
    if(myLogFile == NULL) { ... } // failure to open
  }
   return myLogFile;
}

除非有一些额外的限制,否则我会选择这种方法。例如,由于您说问题不仅与日志文件有关,而且与任何共享功能有关,因此如果您有一个多线程应用程序,您可能必须考虑线程安全。

关于c - C 中的共享日志文件 - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32618822/

相关文章:

c - 关于 CS50 pset2 vigenere

c - 将包含单词和数字的缓冲区过滤为仅包含单词的缓冲区和仅包含数字的缓冲区

c - Libmicrohttpd和ssl

c - C 字符串中非空白字符的第一个索引

Java Logger - 配置更改未反射(reflect)在运行时

Android:内核崩溃后如何获取内核日志?

java - Datastax 驱动程序日志级别

Python 正确的全局用法

objective-c - 如果并发不是问题,是否有任何避免使用全局对象的理由?

database - 这种数据访问模式是线程安全的吗?