私はシェルスクリプトがスクリプトの呼び出し方法を変更せずにすべての出力を外部ファイルに書き込んで、各行stdout
(stderr
およびいくつかの追加項目)にタイムスタンプを追加したいと思います。出力リダイレクトはスクリプト自体内で発生する必要があります。また、スクリプトやパイプラインコマンドの既存のコードを個別に変更しないでください。理想的には、スクリプトに数行を追加するだけです。
次の2つの答えを使用してください。
Bashで実行できるポイントに達しました。
#! /usr/bin/env bash
CUSTOM_PREFIX1="FancyScript"
CUSTOM_PREFIX2="SomeRunID_12-3-4.5"
LOG_FILE="/var/log/script.log"
touch $LOG_FILE
exec 1>> >(while IFS= read -r line; do printf '[%s] %s %s: %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "${CUSTOM_PREFIX1}" "${CUSTOM_PREFIX2}" "${line}"; done >> "${LOG_FILE}")
exec 2>&1
# Script continues...
d
echo "Hello"
上記のスクリプトを実行すると、出力は生成されず、次のログファイルが生成されます。
# cat /var/log/script.log
[2022-02-23 03:11:45] FancyScript SomeRunID_12-3-4.5: Development/shell_log.sh: line 12: d: command not found
[2022-02-23 03:11:45] FancyScript SomeRunID_12-3-4.5: Hello
これまでは大丈夫でしたが、2つを変えたいです。
sh
Bashに依存せずにPOSIXシェル()で動作するようにしてください。普通sh
嫌いexec 1>> >(...)
(while IFS= read ....)
私はこれを最も古い子プロセスではなく、スクリプト自体内の関数にパイプしたいと思います。それはまるでpipe_log() {...}
ベストアンサー1
私の考えではlogger
この目的のために特別に書かれています:システムログファイルに書き込みます。
詳細については、ユーティリティlogger(1)
マニュアル(man logger
)と上記のPOSIX仕様リンクを参照してください。