c - 如何在日志文件中引入日期和时间

标签 c linux datetime logging

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

最佳答案

您需要考虑使用 dategmtimelocaltime 来获取实际日期和时间。

然后 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/

相关文章:

java - 如何在 linux 中查找 oracle 监听器端口

javascript - 在选择下拉列表中获取最近 3 个月的名称

java - 解析日期时无法从 TemporalAccessor 获取 ZonedDateTime

c++ - 创建静默 CLI 选项的最佳实践?

c - 自由RTOS : How to measure context switching time?

c++ - 使用 PoDoFo 库从 PDF 运算符中的数组 TJ 中提取文本

c# - DateTime.Now 和文化/时区特定

c - 从 C 中的函数返回后变量值发生变化

linux - 如何在 Linux 终端中使用 Python Behave 创建 Hello World 测试?

linux - 如何使用wget递归地获取一些带有模式的数据