How to add timestamp to STDERR redirection

后端 未结 13 2490
感情败类
感情败类 2020-11-28 05:10

In bash/ksh can we add timestamp to STDERR redirection?

E.g. myscript.sh 2> error.log

I want to get a timestamp written on the log too.

13条回答
  •  眼角桃花
    2020-11-28 05:47

    How about timestamping the remaining output, redirecting all to stdout?

    This answer combines some techniques from above, as well as from unix stackexchange here and here. bash >= 4.2 is assumed, but other advanced shells may work. For < 4.2, replace printf with a (slower) call to date.

    : ${TIMESTAMP_FORMAT:="%F %T"} # override via environment
    _loglines() { 
        while IFS= read -r _line ; do 
          printf "%(${TIMESTAMP_FORMAT})T#%s\n" '-1' "$_line";
        done;
    }
    exec 7<&2 6<&1
    exec &> >( _loglines )
    # Logit
    

    To restore stdout/stderr:

    exec 1>&6 2>&7
    

    You can then use tee to send the timestamps to stdout and a logfile.

    _tmpfile=$(mktemp)
    exec &> >( _loglines | tee $_tmpfile )
    

    Not a bad idea to have cleanup code if the process exited without error:

    trap "_cleanup \$?" 0 SIGHUP SIGINT SIGABRT SIGBUS SIGQUIT SIGTRAP SIGUSR1 SIGUSR2 SIGTERM
    _cleanup() { 
        exec >&6 2>&7
        [[ "$1" != 0 ]] && cat "$_logtemp"
        rm -f "$_logtemp"
        exit "${1:-0}"
    }
    

提交回复
热议问题