Назад | Перейти на главную страницу

Прикрепите метку времени к каждой строке стандартного вывода

Я размещаю несколько игровых серверов, и каждый экземпляр сервера работает в стандартном выводе, но у них нет временных меток, просто регистрируются события в новых строках, например:

и т.п.

Проблема в том, что когда сервер падает, я понятия не имею, когда это произошло.

Есть ли способ передать серверы 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