エラーストリームに自分の情報を追加してください。

エラーストリームに自分の情報を追加してください。

私たちが知っているように、次のコマンドを使用してエラーを特定のファイルにリダイレクトできます。

./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 はストリームをエラーログに追加します。

関連情報