首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在日志文件中引入日期和时间

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

Stack Overflow用户
提问于 2011-09-14 12:37:39
回答 4查看 27.8K关注 0票数 13

我有一个用C编写的守护进程。我将事件记录在日志文件中,但现在我想在将事件写入日志文件时添加日期和时间。我怎样才能做到这一点呢?

当前日志文件:-

代码语言:javascript
复制
Event one occurred: result:
Event two occurred: result:

我希望日志文件看起来像这样:

代码语言:javascript
复制
Sep 14 11:35:55 Event one occurred: result:
Sep 14 11:35:55 Event two occurred: result:

我的环境是C和Linux。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-14 12:43:16

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

然后strftime可以为您格式化它。

示例程序如下:

代码语言:javascript
复制
#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;
}

这将输出以下内容:

代码语言:javascript
复制
2011-09-14 04:52:11 Event occurred now

我更喜欢使用UTC而不是本地时间,因为它允许您将来自不同地理位置的机器的事件捆绑在一起,而无需担心时区差异。换句话说,除非您非常确定不会跨越时区,否则请使用gmtime而不是localtime

我还倾向于使用YYYY-MM-DD HH:MM:SS格式,因为它比月份名称更容易排序,这对于提取和操作工具至关重要。

如果您的实现提供了可选的边界检查函数(根据C11的附录K),那么您可能会优先使用gmtime_s。它允许您指定自己的缓冲区来接收结果,因此在可重入和/或线程化代码中更安全。

要使用它,您需要将代码更改为如下所示:

代码语言:javascript
复制
#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;
}

尽管你应该意识到微软的人们已经设法以错误的方式获得了gmtime_s的论点。你需要考虑到这一点。

POSIX (和Linux)还提供了一个gmtime_r函数,它的执行方式与标准gmtime_s函数相同(参数的顺序正确)。

票数 15
EN

Stack Overflow用户

发布于 2014-03-20 01:25:12

根据@paxdiablo的回答,添加我的日志函数。使用本地时间,但只需修改getFormattedTime()即可使用格林尼治标准时间

common.h

代码语言:javascript
复制
// Returns the local date/time formatted as 2014-03-19 11:11:52
char* getFormattedTime(void);

// Remove path from filename
#define __SHORT_FILE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)

// Main log macro
#define __LOG__(format, loglevel, ...) printf("%s %-5s [%s] [%s:%d] " format "\n", getFormattedTime(), loglevel, __func__, __SHORT_FILE__, __LINE__, ## __VA_ARGS__)

// Specific log macros with 
#define LOGDEBUG(format, ...) __LOG__(format, "DEBUG", ## __VA_ARGS__)
#define LOGWARN(format, ...) __LOG__(format, "WARN", ## __VA_ARGS__)
#define LOGERROR(format, ...) __LOG__(format, "ERROR", ## __VA_ARGS__)
#define LOGINFO(format, ...) __LOG__(format, "INFO", ## __VA_ARGS__)

common.c

代码语言:javascript
复制
#include <time.h> // time_t, tm, time, localtime, strftime

// Returns the local date/time formatted as 2014-03-19 11:11:52
char* getFormattedTime(void) {

    time_t rawtime;
    struct tm* timeinfo;

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    // Must be static, otherwise won't work
    static char _retval[20];
    strftime(_retval, sizeof(_retval), "%Y-%m-%d %H:%M:%S", timeinfo);

    return _retval;
}

您可以像这样使用它们:

代码语言:javascript
复制
 LOGDEBUG("This is a log");
 LOGDEBUG("This is a log with params %d", 42);

它会产生输出:

代码语言:javascript
复制
2014-03-19 13:22:14 DEBUG [main] [main.c:54] This is a log
2014-03-19 13:22:14 DEBUG [main] [main.c:55] This is a log with params 42
票数 11
EN

Stack Overflow用户

发布于 2011-09-14 12:48:03

要获取当前时间,您可以使用time.h,例如...

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
  time_t now;
  time(&now);

  printf("%s", ctime(&now)); // use ctime to format time to a string.

  return EXIT_SUCCESS;
}

您还可以按照paxdiablo的建议使用strftime,以获得更多的时间/日期格式。

当然,对于您的情况,ctime(&now)的结果将进入您的日志条目字符数组/字符串,而不是printf

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7411301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档