Recently, we received a binary that collected data from a web service and it printed them on screen.
The binary did not print a time stamp in front of each line so we had to improvise of a way to add the time stamp to the logs without modifying the binary.
The solution we came to was to use awk
to prepend the time stamp in front of every line using a pipe.
Specifically, our solution was the following:
server_application 2>&1 | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'
What we did there was to start our binary server_application
, redirect stderr
to stdout
(using 2>&1
) so that we will have only one stream and then we read the lines one by one using awk
and printed the time stamp right before the line ($0
) using strftime
.
The strftime()
function formats the broken-down time according to the format specification format.
fflush
forces a write of all user-space buffered data for the given output or update stream via the stream’s underlying write function. We call it at each line to make sure that we do not cause additional delay in presenting the data due to buffering limitations caused by our prints.
Example
$ echo -e "hi\nHI" 2>&1 | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }' 2017-06-21 20:33:41 hi 2017-06-21 20:33:41 HI