我正在托pipe一些游戏服务器,每个服务器实例运行在标准输出,但他们没有时间戳,只是将事件logging到新行,例如:
等等
这个问题是,当服务器崩溃,我不知道什么时候发生。
有没有办法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