Оболочка Linux: как добавить строку префикса в сообщение stderr?

Я выполняю несколько задач одновременно в фоновом режиме.

command_a | tee > command_a.log &
command_b | tee > command_b.log &

Если все хорошо, то сообщения будут сохранены в лог-файлы.

Если что-то не так, он выведет ошибки на экран.

Но command_a и command_b очень похожи, трудно сказать, какое сообщение об ошибке генерируется какой командой.

Могу ли я добавить строку префикса в сообщения об ошибках, например:

command_a: error 123
command_b: error 456
command_a: error 256
command_a: error 555
command_b: error 333

2 ответа

Решение

замены процесса bash:

command_a 2> >(sed 's/^/command_a: /' >&2) > command_a.log &
command_b 2> >(sed 's/^/command_b: /' >&2) > command_b.log &

Вам не нужно трубку к tee если вы просто перенаправите его стандартный вывод в файл.

Вы даже можете делать такие необычные вещи, как печать метки времени:

$ {
  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

Вставьте его в функцию для повторного использования:

log_stderr() {
    gawk -v pref="$1" '{print pref":", strftime("%F %T", systime()), $0}' >&2
}

command_a > command_a.log 2> >(log_stderr "command_a")

Вывод префикса

      {
  echo foo
  sleep 1
  echo bar >&2
} \
   > >(sed "s/^/$(date '+%Y-%m-%d %H:%M:%S') [INF] /") \
  2> >(sed "s/^/$(date '+%Y-%m-%d %H:%M:%S') [ERR] /" >&2)

Вывод префикса и перенаправление в файл журнала

Перенаправить скрипт наtest.logфайл:

      {
  echo foo
  sleep 1
  echo bar >&2
} \
   > test.log \
  2>&1 \
   > >(sed "s/^/$(date '+%Y-%m-%d %H:%M:%S') [INF] /") \
  2> >(sed "s/^/$(date '+%Y-%m-%d %H:%M:%S') [ERR] /" >&2)
Другие вопросы по тегам