Attach timestamp to each line of stdout

Im am hosting some game servers, and each server instance runs in stdout, but they don't have timestamps, just logging events to new lines, e.g.:

  • player a connected
  • player b connected
  • game started
  • player X fragged player Y
  • game ended

etc.

The problem with this is that when the server crashes I have no idea when did that happen.

Is there a way to pipe servers stdout trough some command, and get the same output back to file, or stdout again, but with timestamp in front???


Create a bash script as the following:

#!/bin/bash

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

Call it relog.sh and set it as executable issuing chmod +x relog.sh Then you can pipe through it and it will print a timestamp followed by the original log line. For example, issuing cat /etc/services | ./relog.sh will produce an output similar to this:

[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

Please note that the above script is only a stub; you can (must?) complete it as per your needs.


This could be much faster than a bash script but basically does the same thing.

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

Execute as

yourapp | thisscript.pl

Example

$ ./a | ./stdout.pl 
20151028200508 test
20151028200509 test2