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.

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

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.