Fish Shell:
ロギング

方法:

Fishでは、ログ記録は標準出力とエラーストリームをファイルにリダイレクトするだけの簡単なものになります。スクリプトの開始時刻と終了時刻のログエントリを作成しましょう。

function log_start
  echo (date "+%Y-%m-%d %H:%M:%S") " - スクリプト開始" >> my_app.log
end

function log_end
  echo (date "+%Y-%m-%d %H:%M:%S") " - スクリプト終了" >> my_app.log
end

log_start
# ... スクリプトのタスク ...
log_end

cat my_app.log

これにより、my_app.log では以下のような結果が表示されます:

2023-04-01 10:35:47  - スクリプト開始
2023-04-01 10:36:02  - スクリプト終了

高度なログ記録には、ログレベルとメッセージのためのパラメータを持つ関数を利用することができます:

function log_message --argument message
  switch "$argv[1]"
    case 'INFO' 'WARN' 'ERROR'
      set log_level $argv[1]
    case '*'
      set log_level 'DEBUG'
  end
  set log_msg (string join " " $argv[2..-1])
  echo (date "+%Y-%m-%d %H:%M:%S") "[$log_level]" $log_msg >> my_app.log
end

log_message INFO "情報メッセージです。"
log_message ERROR "何か問題が発生しました!"

サンプル my_app.log の出力例です:

2023-04-01 10:35:47 [INFO] 情報メッセージです。
2023-04-01 10:35:49 [ERROR] 何か問題が発生しました!

深堀り

歴史的には、シェルスクリプトでのログ記録は多くの echo 命令で行われていましたが、これは確かに今でも選択肢の一つですが、より複雑なシステムの実装は挑戦になり得ます。Fishには、他のシェルやプログラミング言語のように、組み込みのログメカニズムがありませんので、自分で作成する必要がよくあります。

Fishの組み込みの echo コマンドに代わるログ記録用のUnixツールには、sysloglogger などがあり、システムログデーモンとのインタフェースを提供し、システム全体のイベントをログ記録するためのより統合されたアプローチとなります。

Fishのシンプルさは、ログの詳細度を扱う関数を作成することを可能にし、オンまたはオフに切り替え可能な異なるレベルを設定することができます。実装によっては、スクリプトの名前、行番号、タイムスタンプも含めることができ、イベントに至るまでのステップを遡りやすくします。

参照