POSIX Shell:関数を使用してログを出力し、行の前にタイムスタンプを追加します。

POSIX Shell:関数を使用してログを出力し、行の前にタイムスタンプを追加します。

私はシェルスクリプトがスクリプトの呼び出し方法を変更せずにすべての出力を外部ファイルに書き込んで、各行stdoutstderrおよびいくつかの追加項目)にタイムスタンプを追加したいと思います。出力リダイレクトはスクリプト自体内で発生する必要があります。また、スクリプトやパイプラインコマンドの既存のコードを個別に変更しないでください。理想的には、スクリプトに数行を追加するだけです。

次の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つを変えたいです。

  1. shBashに依存せずにPOSIXシェル()で動作するようにしてください。普通sh嫌いexec 1>> >(...)
  2. (while IFS= read ....)私はこれを最も古い子プロセスではなく、スクリプト自体内の関数にパイプしたいと思います。それはまるでpipe_log() {...}

ベストアンサー1

私の考えではloggerこの目的のために特別に書かれています:システムログファイルに書き込みます。

詳細については、ユーティリティlogger(1)マニュアル(man logger)と上記のPOSIX仕様リンクを参照してください。

おすすめ記事