如何向日志文件的每一行添加时间戳?

如何向日志文件的每一行添加时间戳?

我有一个无法编辑的外部程序。它将日志写入文件。

当程序写入日志文件时,如何向每一行添加时间戳?
它不会将其输出写入标准输出。时间戳至少应包含秒。最好只使用标准的 Linux 工具,如管道、bash、cron 等。

在测试了几个示例脚本后,我注意到该程序关闭日志文件以重新加载其配置,然后它重新创建相同的文件作为纯空文本文件。我想这意味着必须使用另一种方法,例如连续(cron)重新检查文件内容?

答案1

您可以创建一个fifo并配置您的程序以在其中写入日志吗?

如果是,请创建 fifo 并编写一个简单的 shell 脚本,从该脚本中读取数据并将其写入日志文件中,并在时间戳之前添加。就像是:

#!/bin/sh
FIFOFILE=/tmp/program_log.fifo
LOGFILE=/var/log/program.log

mkfifo $FIFOFILE
awk '{printf("%s - %s\n", systime(), $0);}' < $FIFOFILE > $LOGFILE

第二个版本

如果您的程序执行日志轮转并定期删除 fifo,则必须使用另一种方法。

您可以使用tail程序日志文件来监视。注意尾部检查定期地文件,所以(如果你很不幸)你可能会丢失一些日志行。

#!/bin/sh
PROGRAMLOGFILE=/tmp/program.log
MARKEDLOGFILE=/var/log/program.log

tail -F $PROGRAMLOGFILE \
    | awk '{printf("%s - %s\n", systime(), $0);}' \
    > $MARKEDLOGFILE

答案2

基于我评论中的 syslog-idea:

tail -n1 -q -f --retry $YOURFILE 2>/dev/null |logger

这似乎适用于 CentOS 5。请参阅 tail 和 logger 的本地手册页。

在 CentOS 中,有一个关于使用“--retry”的警告:标准错误并且必须被压制。

logger可以将消息发送到系统日志 - 系统日志通常会在前面加上时间戳。

相关内容