Linux shell:如何向 stderr 消息添加前缀字符串?

Linux shell:如何向 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

答案1

狂欢流程替代

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")

答案2

前缀输出

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

相关内容