Bash – Redirect stdout and stderr, with timestamps on stderr only

bash

I'm trying to hack in better logging for a test program that I didn't write. I want all lines of STDERR output to have timestamps, but if possible I want to leave STDOUT alone. I also want one file (all.txt) to log both stdout and stderr (either with or without STDERR timestamps), and a file dedicated to STDERR output (errors.txt, with timestamps)

Also, I don't care whether anything is echoed to the terminal or not. This is a batch-style program.

I did look at rsyslog and that might come in later, but this is a solution I should be able to hack in real quick…at least, if I knew more about output redirection. I read a bunch of similar questions but apparently nothing with this exact situation.

I think in order to add timestamps to stderr output, I want to use a pipe and the technique from this question: https://serverfault.com/questions/310098/adding-a-timestamp-to-bash-script-log

What is the cleanest solution here? Note that I have RHEL5 systems that are on bash 3.2.25.

            +----stdout-------------------+
           /                               \
test.pl --+                                 +--> all.txt
           \                               /
            +----stderr | add_timestamps -+----> errors.txt

Best Answer

I think this will do what you want:

test.pl 2>&1 >all.txt | add_timestamps | tee -a all.txt > errors.txt

  • Redirect stderr to stdout (so we can pipe it later)
  • Redirect (the original) stdout to all.txt
  • Pipe stdout (which now contains the error messages) to add_timestamps
  • Use tee to append errors (with timestamps) to all.txt
  • Finally, also write the errors to errors.txt
Related Question