Anexar data / hora a cada linha de stdout

2

Estou hospedando alguns servidores de jogos e cada instância do servidor é executada no stdout, mas eles não têm registros de data e hora, apenas registram eventos em novas linhas, por exemplo:

  • jogador conectado
  • player b conectado
  • jogo iniciado
  • jogador X com fragmento Y
  • jogo finalizado

etc.

O problema é que, quando o servidor trava, não faço ideia de quando isso aconteceu.

Existe uma maneira de canalizar os servidores de stdout através de algum comando, e obter a mesma saída de volta ao arquivo, ou stdout novamente, mas com timestamp na frente ???

    
por kodisha 28.10.2015 / 20:51

2 respostas

3

Crie um script bash como o seguinte:

#!/bin/bash

while read -r line; do
        timestamp='date'
        echo "[$timestamp] $line"
done

Chame relog.sh e defina como executável, emitindo chmod +x relog.sh Então você pode passar por ele e imprimir um timestamp seguido pela linha de log original. Por exemplo, a emissão de cat /etc/services | ./relog.sh produzirá uma saída semelhante a esta:

[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

Por favor, note que o script acima é apenas um esboço; você pode (deve?) completá-lo conforme suas necessidades.

    
por 28.10.2015 / 22:38
1

Isso pode ser muito mais rápido do que um script bash, mas basicamente faz a mesma coisa.

#!/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, " $_");
}

Executar como

yourapp | thisscript.pl

Exemplo

$ ./a | ./stdout.pl 
20151028200508 test
20151028200509 test2
    
por 29.10.2015 / 01:03