如何将输出重新路由到带时间戳的文件?

时间:2014-04-15 03:14:29

标签: c++ linux

我在Linux中有一个c ++程序(二进制文件,我无法修改),它在标准输出中打印从其他程序获得的消息。所以,如果我运行该程序,它会不时地打印消息标准输出。我通常将输出重新路由到日志文件来读取。 program > & 1.log

示例1.log文件: message 1 message 2 message 3

问题是,消息没有时间戳。因此,我需要在收到时间的情况下打印1.log中的邮件。

通缉表格: 07:12:08 211030 Message1 07:12:08 234630 Message1 07:12:08 254320 Message1

有人能告诉我怎么做吗?

2 个答案:

答案 0 :(得分:1)

嗯,程序可能会出现一些问题而不是经常刷新输出,因此时间戳可能比运行的日志记录代码晚,但您可以轻松编写过滤器:

#include <iostream>
#include <iomanip>
#include <string>
#include <ctime>

int main()
{
    std::string line;
    while (getline(std::cin, line))
    {
         time_t seconds = time(NULL);
         struct tm datetime = *localtime(&seconds);
         std::cout << std::setw(2) << std::setfill('0') << datetime.tm_hour << ':'
                   << std::setw(2) << std::setfill('0') << datetime.tm_min << ':'
                   << std::setw(2) << std::setfill('0') << datetime.tm_sec << ' '
                   << line << '\n';
    }
}

然后,如果您将其编译为timestamper,请按以下方式调用您的程序:

program | timestamper >& 1.log

或者,使用awk

program | awk '{ print strftime("%T"), $0 }' >& 1.log

答案 1 :(得分:1)

您可以编写一个示例shell脚本来包装该程序,例如

program | while read msg; do
    date
    echo $msg
done

并将此脚本的输出重定向到您的日志文件。

如果您不喜欢date的默认输出,可以通过添加适当的选项来更改其输出,有关详细信息,请参阅其手册date(1)