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

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

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

  • 玩家 a 已连接
  • 玩家 b 已连接
  • 游戏开始
  • 玩家 X 击杀了玩家 Y
  • 游戏结束

ETC。

问题在于当服务器崩溃时我不知道它什么时候发生。

有没有办法通过某些命令来管道服务器标准输出,并将相同的输出返回到文件或再次返回到标准输出,但前面带有时间戳???

答案1

创建如下的 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将产生类似于以下内容的输出:

[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

请注意,上述脚本仅为存根;您可以(必须?)根据您的需要完成它。

答案2

这可能是快多了但基本上完成相同的功能。

/usr/bin/perl 的 #!

# 打印标准输入的每一行
尽管() {
        # 获取当前时间
        我的@now = localtime();

        # 重新排列以下内容以满足您的盖章需要。
        # 它目前生成 YYYYMMDDhhmmss
        我的 $timeStamp = sprintf("%04d%02d%02d%02d%02d%02d",
                        现在[5]+1900美元,现在[4]+1美元,现在[3]美元,
                        $现在[2],$现在[1],$现在[0]);

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

执行方式

你的应用程序 | thisscript.pl

例子

$./a|./stdout.pl
20151028200508 测试
20151028200509 测试2

答案3

使用tsmoreutils 中的命令(apt get moreutils)。

 $ ls -1 | ts

Oct 12 20:09:27 ts-out.v37mPS
Oct 12 20:09:27 ts-out.vavMYs
Oct 12 20:09:27 ts-out.wd9G1Y
Oct 12 20:09:27 ts-out.ym8aN0
Oct 12 20:09:27 ts-out.zCzWhY

相关内容