我正在托管一些游戏服务器,每个服务器实例都在标准输出中运行,但它们没有时间戳,只是将事件记录到新行,例如:
- 玩家 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
使用ts
moreutils 中的命令(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