6

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
1
  • To add timestamps you could try ts from the package moreutils. Commented Aug 20, 2012 at 18:14

1 Answer 1

5

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
4
  • 1
    I think there's a possibility of a race-condition here. Both tee and stdout of test.pl are writing to all.txt. There's no guarantee that the lines will be in the same order that would be seen when running it in a terminal. Commented Aug 20, 2012 at 18:13
  • 1
    Right, but since they are separate streams I'm not sure if there is any way to prevent that Commented Aug 20, 2012 at 18:17
  • Right you are. A the possibility of a race condition seems unavoidable what ever the solution. Commented Aug 20, 2012 at 18:24
  • 1
    @donothingsuccessfully, lk- This question asked how to get the output in order reliably, and no one had a solution. Commented Aug 20, 2012 at 22:48

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.