
よっしー
こんにちは。よっしーです(^^)
今日は、bashにおけるlogging(ロギング)についてご紹介します。
背景
bashにおけるlogging(ロギング)について調査する機会があったので、そのときの内容を備忘として残しました。
この記事のソースは下記のサイトにアップしています。
実行環境について
実行環境は下記の記事を参考にお願いします。
概要
本記事のロギングは、標準エラーを画面とファイルへの出力を同時に行います。
作成ファイル一覧
下記のファイルを作成しました。
new file: local/work/07_logging/07_logging.sh
07_logging.sh
#!/usr/bin/env bash
set -euCo pipefail
readonly LOG_OUT=./stdout.log
readonly LOG_ERR=./stderr.log
exec 1> >(tee -a "$LOG_OUT")
exec 2> >(tee -a "$LOG_ERR")
function log() {
echo "[$(date '+%Y/%m/%d %H:%M:%S.%3N')] $*"
}
log "$(which bash)"
log "$(bash --version)"
# 標準エラーへの出力確認用
ls dummy.txt
動作確認
下記のコマンドを実行します。
make build
make up
make login
cd 07_logging
chmod +x 07_logging.sh
./07_logging.sh
下記の結果が ./stderr.log に出力されていれば成功です。
root@051f475794e3:/work/07_logging# cat stderr.log
ls: cannot access 'dummy.txt': No such file or directory
strout.logにも同様のエラー文言が出力されている想定です。
root@051f475794e3:/work/07_logging# cat stdout.log
[2023/12/10 06:57:51.544] /usr/bin/bash
[2023/12/10 06:57:51.546] GNU bash, version 5.2.15(1)-release (aarch64-unknown-linux-gnu)
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
ls: cannot access 'dummy.txt': No such file or directory
解説
07_logging.sh
このスクリプトは、標準出力と標準エラーをそれぞれ異なるログファイルに記録する Bash シェルスクリプトです。以下に各部分の解説を示します。
#!/usr/bin/env bash: スクリプトが Bash シェルで実行されることを指定しています。set -euCo pipefail: スクリプトの設定を変更しています。
-e: エラーが発生したら即座にスクリプトを終了します。-u: 未定義の変数を使用しようとするとエラーを発生させます。-C: コマンドの返り値が0以外の場合、そのコマンドが非零であることを示します。-o pipefail: パイプの途中でエラーが発生した場合、パイプ全体をエラーとして扱います。
readonly LOG_OUT=./stdout.log: 標準出力を記録するログファイルのパスを指定します。readonly LOG_ERR=./stderr.log: 標準エラーを記録するログファイルのパスを指定します。exec 1> >(tee -a "$LOG_OUT"): 標準出力をファイルにリダイレクトし、同時にその内容を標準出力にも表示します。リダイレクト先は$LOG_OUTとなります。exec 2> >(tee -a "$LOG_ERR"): 標準エラーをファイルにリダイレクトし、同時にその内容を標準エラーにも表示します。リダイレクト先は$LOG_ERRとなります。function log() { ... }:logという関数を定義しています。この関数は、指定されたメッセージを日付とともにログとして表示します。log "$(which bash)": インストールされている Bash の実行ファイルのパスをログに記録します。log "$(bash --version)": Bash のバージョン情報をログに記録します。ls dummy.txt: 標準エラーへの出力確認用に、存在しないファイルdummy.txtをlsコマンドでリストします。この部分でエラーが発生し、そのエラーが標準エラーに出力されます。
このスクリプトを実行すると、標準出力は stdout.log ファイルに、標準エラーは stderr.log ファイルに同時に記録され、実行時の標準出力と標準エラーの内容が保存されます。
おわりに
今日は、bashにおけるlogging(ロギング)についてご紹介しました。

よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)



コメント