私たちが知っているように、次のコマンドを使用してエラーを特定のファイルにリダイレクトできます。
./some_script 2>error_log
複数のスクリプトを実行していますが、そのスクリプトのエラーをエラーファイルに入れたいと思います。
各エラーインスタンスの前にスクリプト名などの情報を追加する方法はありますか?これにより、エラーログにエラーを投稿したスクリプト名などを記録できます。
答え1
スクリプトのエラーロギング機能を作成します。それは次のとおりです。
logerr () {
printf '%s - %s - %s\n' \
"$(date '+%F:%T')" \
"$(basename "$0")" \
"$*" >&2
}
その後、スクリプトからそれを呼び出すことができます。たとえば、次のようになります。
if false; then
: something for pass
else
logerr failed to be false
fi
そして2>error_log
使用するたびに保証されます。追加をerror_log
使用する必要があります2>>error_log
。
他のコマンドでエラーをキャッチして記録するには、次のコードを組み合わせてください。
#!/bin/bash
logerr () {
local message=$*
if [[ ! -t 0 ]]; then
message=$(</dev/stdin)
fi
if [[ -n "$message" ]]; then
printf '%s - %s - %s\n' \
"$(date '+%F:%T')" \
"$(basename "$0")" \
"$*" >&2
fi
}
ls -lts /fake/path 2>&1 >/dev/tty | logerr
標準出力を必要な適切な場所にリダイレクトします。
これにより、logerr
スクリプトは標準入力(開いている場合)から読み取ることができます(プログラムをlogerrにパイプすることができます)。問題は、プログラムがstderrにエラーメッセージを送信し、stdinとは別に保持したいということです。
答え2
./thescript.sh 2>&1 1>/dev/null | sed '1 s/^/error_message_starts:\n/' >> error_log;
ここでの議論と以下の内容に基づいて:
https://stackoverflow.com/questions/2342826/how-to-pipe-stderr-and-not-stdout
私たちが欲しいものを追加します。エラーストリーム(fd2)をパイプできる必要があります。パイプで接続できる唯一の出力はfd1です。したがって、fd2はfd1にリダイレクトする必要があります。また、邪魔にならないようにfd1を削除する必要があります。
- ./script.sh
- 2>&1エラーストリーム(fd2)、fd1が行く場所に移動します。
- 1>/dev/null。 Fd1が崖から落ちたばかりです。これでエラーログ(fd2)のみがパイプされます。
- | sed.. sedでパイプ操作を実行するには、この内容を前に追加してください。
- >> error_log はストリームをエラーログに追加します。