よっしー
こんにちは。よっしーです(^^)
今日は、bashにおけるlogging(ロギング)についてご紹介します。
背景
bashにおけるlogging(ロギング)について調査する機会があったので、そのときの内容を備忘として残しました。
この記事のソースは下記のサイトにアップしています。
実行環境について
実行環境は下記の記事を参考にお願いします。
概要
本記事のロギングは、infoとdebug、warn、errorで使い分けるようにしました。また、色付けをしています。
作成ファイル一覧
下記のファイルを作成しました。
new file: local/work/12_logging/12_logging.sh
12_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_debug() {
lgg_msg=$(gen_log_msg 'DEBUG' "$*")
echo "${lgg_msg}"
}
function log_err() {
lgg_msg=$(gen_log_msg 'ERROR' "$*")
echo "${lgg_msg}" >&2
}
function gen_log_msg() {
printf "%s\t[%5s]\t%s" "$(date '+%Y/%m/%d %H:%M:%S.%3N')" "$1" "$2"
}
function trap_err() {
error_status=$?
msg=$(printf "エラー発生 \$?=%d %s %s:%d" ${error_status} "${BASH_SOURCE[0]}" "${FUNCNAME[1]}" ${BASH_LINENO[0]})
log_err "${msg}"
}
function trap_exit() {
msg=$(printf "終了時の処理 %s %s:%d" "${BASH_SOURCE[0]}" "${FUNCNAME[1]}" ${BASH_LINENO[0]})
log_debug "${msg}"
}
trap trap_err ERR
trap trap_exit EXIT
log_debug "$(which bash)"
log_debug "$(bash --version)"
# 標準エラーへの出力確認用
ls dummy.txt
echo "ここは表示されない"
動作確認
下記のコマンドを実行します。
make build
make up
make login
cd 12_logging
chmod +x 12_logging.sh
./12_logging.sh
下記のような出力になることを想定しています。
解説
12_logging.sh
このスクリプトは、カラー付きのログ出力、エラーハンドリング、スクリプト終了時の処理を組み合わせた Bash スクリプトです。以下に各部分の解説を示します:
ESC="$(printf '\033')"
: エスケープシーケンスをESC
として定義しています。これは、後でログメッセージに色を付けるために使用されます。LOG_OUT=./stdout.log
およびLOG_ERR=./stderr.log
: 標準出力と標準エラーのログファイルのパスを指定しています。exec 1> >(tee -a "$LOG_OUT")
およびexec 2> >(tee -a "$LOG_ERR")
: 標準出力と標準エラーをそれぞれファイルにリダイレクトし、同時にその内容を標準出力と標準エラーにも表示します。function log_info() { ... }
,function log_debug() { ... }
,function log_warn() { ... }
,function log_err() { ... }
: ログの種類によって異なる色でログを表示するための関数を定義しています。gen_log_msg
関数を呼び出してログの整形を行います。function gen_log_msg() { ... }
: ログメッセージを整形する関数です。色や日時などを含むログメッセージを生成します。function trap_err() { ... }
: エラーが発生した際に呼び出される関数です。エラーのステータスや発生箇所の情報を取得し、log_err
関数を呼び出してエラーログを記録します。function trap_exit() { ... }
: スクリプトが終了する際に呼び出される関数です。終了時の処理を行い、log_debug
関数を呼び出してデバッグログを記録します。trap trap_err ERR
:ERR
シグナルに対して、trap_err
関数が呼び出されるように設定します。trap trap_exit EXIT
:EXIT
シグナルに対して、trap_exit
関数が呼び出されるように設定します。log_debug "$(which bash)"
およびlog_debug "$(bash --version)"
: インストールされている Bash の実行ファイルのパスとバージョン情報をデバッグログに記録します。log_info "info test"
およびlog_warn "warn test"
: インフォメーションとワーニングのログを出力します。ls dummy.txt
: 標準エラーへの出力確認用に、存在しないファイルdummy.txt
をls
コマンドでリストします。この部分でエラーが発生し、trap_err
関数が呼び出されてエラーログが記録されます。echo "ここは表示されない"
: 上記のls dummy.txt
でエラーが発生した場合、この行は実行されません。スクリプトはエラーが発生した時点で終了するため、この行は実行されません。
おわりに
今日は、bashにおけるlogging(ロギング)についてご紹介しました。
よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント