我有一个用 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/