将时间戳附加到标准输出的每一行

我正在托pipe一些游戏服务器,每个服务器实例运行在标准输出,但他们没有时间戳,只是将事件logging到新行,例如:

  • 播放器连接
  • 播放器b连接
  • 游戏开始
  • 玩家X碎片玩家Y
  • 游戏结束

等等

这个问题是,当服务器崩溃,我不知道什么时候发生。

有没有办法pipe道服务器标准输出通过一些命令,并得到相同的输出回到文件,或标准输出再次,但与前面的时间戳?

创build一个bash脚本,如下所示:

#!/bin/bash while read -r line; do timestamp=`date` echo "[$timestamp] $line" done 

将其称为relog.sh并将其设置为可执行文件,然后发出chmod +x relog.sh然后您可以通过它来打印时间戳,然后打印出原始日志行。 例如,发行cat /etc/services | ./relog.sh cat /etc/services | ./relog.sh将会产生类似如下的输出:

 [Wed Oct 28 22:34:25 CET 2015] netmap_lm 1493/tcp # netmap_lm [Wed Oct 28 22:34:25 CET 2015] netmap_lm 1493/udp # netmap_lm [Wed Oct 28 22:34:25 CET 2015] cvc 1495/tcp # cvc [Wed Oct 28 22:34:25 CET 2015] cvc 1495/udp # cvc 

请注意,上面的脚本只是一个存根, 你可以(必须)根据你的需要来完成它。

这可能比bash脚本快得多,但基本上是一样的。

 #!的/ usr / bin中/ perl的

 #打印stdin的每一行
 while(){
         #抓住当前时间
        我的@now = localtime();

         #重新安排以下内容以适应您的冲压需求。
         #它目前生成YYYYMMDDhhmmss
         my $ timeStamp = sprintf(“%04d%02d%02d%02d%02d%02d”,
                         $ now [5] +1900,$ now [4] +1,$ now [3],
                         $ now [2],$ now [1],$ now [0]);

        打印($ timeStamp,“$ _”);
 }

执行为

yourapp | thisscript.pl

 $ ./a |  ./stdout.pl 
 20151028200508testing
 20151028200509 test2