bash入門:logging(ロギング)について -vol.6-

スポンサーリンク
bash入門:logging(ロギング)について -vol.6- ノウハウ
bash入門:logging(ロギング)について -vol.6-
この記事は約6分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、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 スクリプトです。以下に各部分の解説を示します:

  1. ESC="$(printf '\033')": エスケープシーケンスを ESC として定義しています。これは、後でログメッセージに色を付けるために使用されます。
  2. LOG_OUT=./stdout.log および LOG_ERR=./stderr.log: 標準出力と標準エラーのログファイルのパスを指定しています。
  3. exec 1> >(tee -a "$LOG_OUT") および exec 2> >(tee -a "$LOG_ERR"): 標準出力と標準エラーをそれぞれファイルにリダイレクトし、同時にその内容を標準出力と標準エラーにも表示します。
  4. function log_info() { ... }, function log_debug() { ... }, function log_warn() { ... }, function log_err() { ... }: ログの種類によって異なる色でログを表示するための関数を定義しています。gen_log_msg関数を呼び出してログの整形を行います。
  5. function gen_log_msg() { ... }: ログメッセージを整形する関数です。色や日時などを含むログメッセージを生成します。
  6. function trap_err() { ... }: エラーが発生した際に呼び出される関数です。エラーのステータスや発生箇所の情報を取得し、log_err関数を呼び出してエラーログを記録します。
  7. function trap_exit() { ... }: スクリプトが終了する際に呼び出される関数です。終了時の処理を行い、log_debug関数を呼び出してデバッグログを記録します。
  8. trap trap_err ERR: ERR シグナルに対して、trap_err関数が呼び出されるように設定します。
  9. trap trap_exit EXIT: EXIT シグナルに対して、trap_exit関数が呼び出されるように設定します。
  10. log_debug "$(which bash)" および log_debug "$(bash --version)": インストールされている Bash の実行ファイルのパスとバージョン情報をデバッグログに記録します。
  11. log_info "info test" および log_warn "warn test": インフォメーションとワーニングのログを出力します。
  12. ls dummy.txt: 標準エラーへの出力確認用に、存在しないファイル dummy.txtls コマンドでリストします。この部分でエラーが発生し、trap_err関数が呼び出されてエラーログが記録されます。
  13. echo "ここは表示されない": 上記の ls dummy.txt でエラーが発生した場合、この行は実行されません。スクリプトはエラーが発生した時点で終了するため、この行は実行されません。

おわりに

今日は、bashにおけるlogging(ロギング)についてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました