我有一个用C编写的守护程序。我将事件记录在日志文件中,但是现在我想在将事件写入日志文件时添加日期和时间。我该如何实现?
当前日志文件:
Event one occurred: result:
Event two occurred: result:
我希望日志文件看起来像:
Sep 14 11:35:55 Event one occurred: result:
Sep 14 11:35:55 Event two occurred: result:
我的环境是C和Linux。
最佳答案
您需要研究使用date
和gmtime
或localtime
来获取实际的日期和时间。
然后strftime
可以为您设置格式。
示例程序如下:
#include <stdio.h>
#include <time.h>
int main (void) {
char buff[20];
struct tm *sTm;
time_t now = time (0);
sTm = gmtime (&now);
strftime (buff, sizeof(buff), "%Y-%m-%d %H:%M:%S", sTm);
printf ("%s %s\n", buff, "Event occurred now");
return 0;
}
输出:
2011-09-14 04:52:11 Event occurred now
我更喜欢使用UTC而不是本地时间,因为它使您可以将来自地理位置分散的计算机中的事件关联在一起,而不必担心时区差异。换句话说,除非您确定不会跨越时区,否则请使用
gmtime
而不是localtime
。我还倾向于使用
YYYY-MM-DD HH:MM:SS
格式,因为它比月份名称更容易排序,这对提取和操作工具至关重要。如果您有一个提供可选的边界检查功能的实现(根据C11的附录K),则可以优先使用
gmtime_s
。它允许您指定自己的缓冲区来接收结果,因此在重入和/或线程化代码中更加安全。要使用它,您需要将代码更改为以下内容:
#include <stdio.h>
#define __STDC_WANT_LIB_EXT1__ 1
#include <time.h>
int main (void) {
char buff[20];
struct tm sTm;
time_t now = time (0);
gmtime_s (&now, &sTm);
strftime (buff, sizeof(buff), "%Y-%m-%d %H:%M:%S", &sTm);
printf ("%s %s\n", buff, "Event occurred now");
return 0;
}
尽管您应该知道,Microsoft的人们已经设法以某种错误的方式获取了
gmtime_s
的参数。您需要考虑到这一点。POSIX(和Linux)还提供了
gmtime_r
函数,该函数的执行方式与标准gmtime_s
函数相同(参数的顺序正确)。关于c - 如何在日志文件中引入日期和时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7411301/