如何说服控制台上的 syslog 输出包含时间戳?

Posted

技术标签:

【中文标题】如何说服控制台上的 syslog 输出包含时间戳?【英文标题】:How can I persuade syslog output on console to include timestamps? 【发布时间】:2014-04-17 12:24:23 【问题描述】:

考虑以下程序:

#include <syslog.h>

int main()

    openlog("test-app", LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
    setlogmask(LOG_UPTO(LOG_DEBUG));

    syslog(LOG_DEBUG, "Testing!");

注意LOG_PERROR 的使用,它向stderr 以及配置为填充syslogd 的任何文件(在我的情况下为/var/log/messages)发出消息。

The console output is:

test-app[28072]: Testing!

系统日志文件包含:

Apr 17 13:20:14 cat test-app[28072]: Testing!

我可以配置syslog 以便控制台输出也包含时间戳吗?如果有,怎么做?

【问题讨论】:

【参考方案1】:

单独使用syslog 调用时,这是不可行的。原因是您在日志文件上看到的时间戳是在将日志消息发送到守护程序之后。实际执行时间戳添加的是系统日志守护程序。日志守护进程是应用时间戳的东西。

当您使用 LOG_CONSLOG_PERROR 选项时,消息会发送到控制台或 stderr 而不会获得时间戳,因为在记录时不会发生时间戳。

基本上使用LOG_CONSLOG_PERROR 完全绕过守护进程;您需要修改 syslog 调用本身的实现以添加您自己的时间戳。值得庆幸的是,这非常简单,因为 syslog 库调用的实现在 glibc 源代码中,并且 the source isn't terribly complicated。

【讨论】:

修改 glibc 使得部署变得相当复杂,所以这很遗憾。 你不需要修改 glibc,你可以在一个小库中实现你自己的等效系统日志并在你的代码中使用它。 syslog 调用的核心是向/dev/log 写入一条简单的消息,其格式为&lt;facility|priority&gt;Message,即获取设施| 的十进制表示。优先级并将其放入&lt;&gt; 并将其发送至/dev/log,例如user.warn == (1 <12>Message 将被放入 user.warn 消息所在的任何位置。 (您可以使用echo "&lt;12&gt;Message" | socat stdin unix-sendto:/dev/log 对其进行测试以查看它是否被记录 是的,可以。不过感觉有点 NIH;不确定我是否会通过代码审查获得相对较少的收益。 我有一段糟糕的 java 代码可以做到这一点,因为它比编写 JNI 存根来调用 syslog 更容易。

以上是关于如何说服控制台上的 syslog 输出包含时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

Winston 3.0 在控制台上为整个输出着色

如何使用 Java 将列的时间戳(6)数据类型值从​​数据库提取到 csv 或在控制台上显示?

如何让 cout 同时发送到控制台和系统日志

如何在控制台上的同一位置写入输出?

如何删除转发时间戳? OSE 版本 Syslog-NG

如何使用 ANSI Escape 代码在控制台上输出彩色文本