Модификация ошибок и запись сообщений на лету - PullRequest
0 голосов
/ 19 марта 2011

У меня есть ситуация, когда я хочу отправить сообщение об ошибке и записать сообщения в один и тот же файл. Чтобы различать сообщения об ошибках и сообщения журнала, я добавляю сообщения журнала следующим образом:

Файл

будет выглядеть так:

===============log_and_error_msg.txt =========
ERR: This message is an error message
INF: This is a log message 

так что любой, кто интересуется сообщениями об ошибках, может grep "ERR" log_and_error_msg.txt

предположим, что я выполняю какой-то скрипт оболочки, подобный этому

./shellscript 2>>log_and_error_msg.txt 1>>log_and_error_msg.txt

Как добавить ERR и INF на лету к каждому сообщению на лету ??

Ответы [ 4 ]

2 голосов
/ 19 марта 2011
#!/bin/bash
exec 3> >(sed 's/^/INF: /' >> prepend.log)
exec 4> >(sed 's/^/ERR: /' >> prepend.log)
echo "some information" >&3
echo "an error" >&4
echo "more information" >&3
echo "this goes to the screen"
echo "this goes to stderr, bypassing the log" >&2
echo "another error" >&4
echo "yet more information" >&3
echo "still information" >&3
echo "oops" >&4
1 голос
/ 19 марта 2011

Вы можете использовать sed. Вставьте sed 's/^/TYPE /' в каждый конвейер, заменив TYPE на ERR: или INF:

0 голосов
/ 20 марта 2011
{ { ./shellscript | sed 's/^/INF: /'; } 2>&1 1>&3 | sed 's/^/ERR: /'; } \
>> log_and_error_message.txt 3>&1
0 голосов
/ 19 марта 2011

Попробуйте перенаправить stderr во временный файл.

./testscript.sh 2> err.tmp | ( while read line ; do echo 'INFO: ' $line ; done ) ; ( while read line ; do echo 'ERR: ' $line ; done ) <err.tmp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...