bash substituições de processos :
command_a 2> >(sed 's/^/command_a: /' >&2) > command_a.log &
command_b 2> >(sed 's/^/command_b: /' >&2) > command_b.log &
Você não precisa canalizar para tee
se apenas redirecionar seu stdout para um arquivo.
Você pode até fazer coisas extravagantes, como imprimir um timestamp:
$ {
date
echo stdout
sleep 3
echo stderr >&2
} 2> >(gawk '{print "foobar:", strftime("[%F %T]", systime()), $0}' >&2) > file.log
foobar: [2015-02-24 11:43:32] stderr
$ cat file.log
Tue Feb 24 11:43:29 EST 2015
stdout
Coloque-o em uma função para reutilização:
log_stderr() {
gawk -v pref="$1" '{print pref":", strftime("%F %T", systime()), $0}' >&2
}
command_a > command_a.log 2> >(log_stderr "command_a")