Я размещаю несколько игровых серверов, и каждый экземпляр сервера работает в стандартном выводе, но у них нет временных меток, просто регистрируются события в новых строках, например:
и т.п.
Проблема в том, что когда сервер падает, я понятия не имею, когда это произошло.
Есть ли способ передать серверы stdout через какую-то команду и получить тот же вывод обратно в файл или снова stdout, но с меткой времени впереди ???
Создайте сценарий 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
Обратите внимание, что приведенный выше сценарий - это всего лишь заглушка; вы можете (должны?) завершить его в соответствии с вашими потребностями.
Это могло быть намного быстрее чем сценарий bash, но в основном делает то же самое.
#!/usr/bin/perl # Print each line of stdin while() { # Grab the current time my @now = localtime(); # Rearrange the following to suit your stamping needs. # it currently generates YYYYMMDDhhmmss my $timeStamp = sprintf("%04d%02d%02d%02d%02d%02d", $now[5]+1900, $now[4]+1, $now[3], $now[2], $now[1], $now[0]); print ($timeStamp, " $_"); }
Выполнить как
yourapp | thisscript.pl
пример
$ ./a | ./stdout.pl 20151028200508 test 20151028200509 test2