我在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
有人能告诉我怎么做吗?
答案 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)
。