TOP →
IT関連覚え書き →
シェル(Shell)サンプル → This Page
シェル(Shell)サンプル
Javaのlog4jのようなログ出力関数
前提
実施環境(以下の両方でテストしてます)
Red Hat 5.3+bash-3.2
Windows7+Cygwin1.7.9
サンプル1
Javaのlog4jのようなログ出力関数を作ってみました。
2通りの関数作りましたが、まずは1つ目。
ログ出力関連関数を記述した common1.sh
それを読み込んで出力関連関数を呼び出す log4jtest1.sh
の2つでセットです。
まず、TRACE、DEBUG、INFO、WARN、ERROR、FATAL用の関数を用意
んで SYSTEM_LOG_LEVEL 変数にログ出力レベルを設定しておけば
指定レベル以下のログは出力されません。
(log4jのpriority設定みたいなもん)
とりあえず common1.sh の先頭の変数(LOG_DIR)を変更すればお使いの環境でもすぐ動かせます。
(ただし、存在するディレクトリを指定して下さい)
common1.sh
#!/bin/sh
# --------------------------------------------------
# 共通シェル
# --------------------------------------------------
# ログ出力先ディレクトリ(環境に合わせて変更して下さい)
LOG_DIR=/home/mitchy/log/
# システムのログ出力レベル(環境に合わせて変更して下さい)
SYSTEM_LOG_LEVEL=INFO
# --------------------------------------------------
# log4jのようなログを出力する関数
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.ログ出力レベル(TRACE、DEBUG、INFO、WARN、ERROR、FATAL)
# 引数3.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
# 出力内容
# YYYY-MM-DD HH:MM:SS,SSS LV [Thread] Application - Message
# ※SSSは"000"で固定
# ※[Thread]は"[main]"で固定
# ※Applicationはlog4jはクラスだがシェルなのでアプリケーションIDとする
# --------------------------------------------------
# ファイル名
# アプリケーションID.log
# --------------------------------------------------
function writelog {
APL_ID=$1
LOG_LEVEL=$2
MESSAGE=$3
# ログ出力レベル(数値)を取得
declare -i LOG_LEVEL_NUM_NOW
declare -i LOG_LEVEL_NUM_SYS
getLogLevelNum ${LOG_LEVEL}
LOG_LEVEL_NUM_NOW=$?
getLogLevelNum ${SYSTEM_LOG_LEVEL}
LOG_LEVEL_NUM_SYS=$?
# システムで定義されたログ出力レベルより低いレベルのログは出力しない
if [ ${LOG_LEVEL_NUM_NOW} -lt ${LOG_LEVEL_NUM_SYS} ]; then
return 0
fi
SYSDATE=`date +"%Y-%m-%d %H:%M:%S"`
FILE_NAME=${APL_ID}.log
LOG_PATH=${LOG_DIR}${FILE_NAME}
if [ ${LOG_LEVEL} = "INFO" ]; then
LOG_LEVEL=" ${LOG_LEVEL}"
elif [ ${LOG_LEVEL} = "WARN" ]; then
LOG_LEVEL=" ${LOG_LEVEL}"
fi
# メッセージ作成
MESSAGE_TEXT="${SYSDATE},002 ${LOG_LEVEL} [main] ${APL_ID} - ${MESSAGE}"
# ログ出力
echo "${MESSAGE_TEXT}" << ${LOG_PATH}
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(TRACEメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logTrace {
writelog "$1" "TRACE" "$2"
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(DEBUGメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logDebug {
writelog "$1" "DEBUG" "$2"
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(INFOメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logInfo {
writelog "$1" "INFO" "$2"
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(WARNメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logWarn {
writelog "$1" "WARN" "$2"
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(ERRORメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logError {
writelog "$1" "ERROR" "$2"
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(FATALメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logFatal {
writelog "$1" "FATAL" "$2"
return $?
}
# --------------------------------------------------
# ログ出力レベルを数値で返す
# --------------------------------------------------
# 引数.ログ出力レベル(文字列)
# 戻り値.ログ出力レベル(数値)
# --------------------------------------------------
function getLogLevelNum {
declare -i LOG_LEVEL_NUM
LOG_LEVEL_NUM=0
case $1 in
"TRACE") LOG_LEVEL_NUM=1;;
"DEBUG") LOG_LEVEL_NUM=2;;
"INFO") LOG_LEVEL_NUM=3;;
"WARN") LOG_LEVEL_NUM=4;;
"ERROR") LOG_LEVEL_NUM=5;;
"FATAL") LOG_LEVEL_NUM=6;;
*) LOG_LEVEL_NUM=0;;
esac
# ログ出力レベル(数値)を戻す
return ${LOG_LEVEL_NUM}
}
log4jtest1.sh
#!/bin/sh
# --------------------------------------------------
# 共通関数を呼び出すだけのシェル
# --------------------------------------------------
# 共通シェルの読み込み
. ./common1.sh
echo "Main - Start"
# ログ出力関数を実行
logTrace "SHELL-001" "xxxxxxxxxxxxxxxxxxx"
logDebug "SHELL-001" "処理開始"
logInfo "SHELL-001" "ファイルを5件取得"
logWarn "SHELL-001" "ファイルの内容が一部不正"
logError "SHELL-001" "ファイルの読み込みに失敗"
logFatal "SHELL-001" "原因不明のエラー"
logDebug "SHELL-001" "処理終了"
# こっちでもいい
writelog "SHELL-001" "TRACE" "xxxxxxxxxxxxxxxxxxx"
writelog "SHELL-001" "DEBUG" "処理開始"
writelog "SHELL-001" "INFO" "ファイルを5件取得"
writelog "SHELL-001" "WARN" "ファイルの内容が一部不正"
writelog "SHELL-001" "ERROR" "ファイルの読み込みに失敗"
writelog "SHELL-001" "FATAL" "原因不明のエラー"
writelog "SHELL-001" "DEBUG" "処理終了"
echo "Main - End"
サンプル2
サンプル1とほとんど同じです。
common の getLogLevelNum 関数の仕様が変わっただけです。
common1 が関数の戻り値で結果を返していたのに対して
common2 が関数の出力で結果を返しています。
なのでそれぞれの writelog 関数での結果取得部分も少し違っています。
どっちがいいかはお好みで。
common2.sh
#!/bin/sh
# --------------------------------------------------
# 共通シェル
# --------------------------------------------------
# ログ出力先ディレクトリ(環境に合わせて変更して下さい)
LOG_DIR=/home/mitchy/log/
# システムのログ出力レベル(環境に合わせて変更して下さい)
SYSTEM_LOG_LEVEL=INFO
# --------------------------------------------------
# log4jのようなログを出力する関数
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.ログ出力レベル(TRACE、DEBUG、INFO、WARN、ERROR、FATAL)
# 引数3.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
# 出力内容
# YYYY-MM-DD HH:MM:SS,SSS LV [Thread] Application - Message
# ※SSSは"000"で固定
# ※[Thread]は"[main]"で固定
# ※Applicationはlog4jはクラスだがシェルなのでアプリケーションIDとする
# --------------------------------------------------
# ファイル名
# アプリケーションID.log
# --------------------------------------------------
function writelog {
APL_ID=$1
LOG_LEVEL=$2
MESSAGE=$3
# ログ出力レベル(数値)を取得
declare -i LOG_LEVEL_NUM_NOW
declare -i LOG_LEVEL_NUM_SYS
LOG_LEVEL_NUM_NOW=`getLogLevelNum ${LOG_LEVEL}`
LOG_LEVEL_NUM_SYS=`getLogLevelNum ${SYSTEM_LOG_LEVEL}`
# システムで定義されたログ出力レベルより低いレベルのログは出力しない
if [ ${LOG_LEVEL_NUM_NOW} -lt ${LOG_LEVEL_NUM_SYS} ]; then
return 0
fi
SYSDATE=`date +"%Y-%m-%d %H:%M:%S"`
FILE_NAME=${APL_ID}.log
LOG_PATH=${LOG_DIR}${FILE_NAME}
if [ ${LOG_LEVEL} = "INFO" ]; then
LOG_LEVEL=" ${LOG_LEVEL}"
elif [ ${LOG_LEVEL} = "WARN" ]; then
LOG_LEVEL=" ${LOG_LEVEL}"
fi
# メッセージ作成
MESSAGE_TEXT="${SYSDATE},002 ${LOG_LEVEL} [main] ${APL_ID} - ${MESSAGE}"
# ログ出力
echo "${MESSAGE_TEXT}" >> ${LOG_PATH}
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(TRACEメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logTrace {
writelog "$1" "TRACE" "$2"
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(DEBUGメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logDebug {
writelog "$1" "DEBUG" "$2"
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(INFOメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logInfo {
writelog "$1" "INFO" "$2"
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(WARNメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logWarn {
writelog "$1" "WARN" "$2"
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(ERRORメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logError {
writelog "$1" "ERROR" "$2"
return $?
}
# --------------------------------------------------
# log4jのようなログを出力する関数(FATALメッセージ用)
# --------------------------------------------------
# 引数1.アプリケーションID(シェルで一意のID)
# 引数2.メッセージ内容
# 戻り値.0=正常終了,0以外=異常終了
# --------------------------------------------------
function logFatal {
writelog "$1" "FATAL" "$2"
return $?
}
# --------------------------------------------------
# ログ出力レベルを数値で返す
# --------------------------------------------------
# 引数.ログ出力レベル(文字列)
# 出力.ログ出力レベル(数値)
# 戻り値.0
# --------------------------------------------------
function getLogLevelNum {
declare -i LOG_LEVEL_NUM
LOG_LEVEL_NUM=0
case $1 in
"TRACE") LOG_LEVEL_NUM=1;;
"DEBUG") LOG_LEVEL_NUM=2;;
"INFO") LOG_LEVEL_NUM=3;;
"WARN") LOG_LEVEL_NUM=4;;
"ERROR") LOG_LEVEL_NUM=5;;
"FATAL") LOG_LEVEL_NUM=6;;
*) LOG_LEVEL_NUM=0;;
esac
# ログ出力レベル(数値)を出力する
echo ${LOG_LEVEL_NUM}
return 0
}
log4jtest2.sh
#!/bin/sh
# --------------------------------------------------
# 共通関数を呼び出すだけのシェル
# --------------------------------------------------
# 共通シェルの読み込み
. ./common2.sh
echo "Main - Start"
# ログ出力関数を実行
logTrace "SHELL-002" "xxxxxxxxxxxxxxxxxxx"
logDebug "SHELL-002" "処理開始"
logInfo "SHELL-002" "ファイルを5件取得"
logWarn "SHELL-002" "ファイルの内容が一部不正"
logError "SHELL-002" "ファイルの読み込みに失敗"
logFatal "SHELL-002" "原因不明のエラー"
logDebug "SHELL-002" "処理終了"
# こっちでもいい
writelog "SHELL-002" "TRACE" "xxxxxxxxxxxxxxxxxxx"
writelog "SHELL-002" "DEBUG" "処理開始"
writelog "SHELL-002" "INFO" "ファイルを5件取得"
writelog "SHELL-002" "WARN" "ファイルの内容が一部不正"
writelog "SHELL-002" "ERROR" "ファイルの読み込みに失敗"
writelog "SHELL-002" "FATAL" "原因不明のエラー"
writelog "SHELL-002" "DEBUG" "処理終了"
echo "Main - End"
実行結果
出力された SHELL-001.log の内容です。
前半4行が logXxx 系関数を使って出力した結果です。
後半4行が writelog 関数を使って出力した結果です。
log4jのように出力レベルをINFOとしたのでINFO以下のTRACEとDEBUGは出力されていません。
サンプル1、サンプル2はともに同じ結果になります。
2011-08-10 22:33:40,002 INFO [main] SHELL-001 - ファイルを5件取得
2011-08-10 22:33:40,002 WARN [main] SHELL-001 - ファイルの内容が一部不正
2011-08-10 22:33:40,002 ERROR [main] SHELL-001 - ファイルの読み込みに失敗
2011-08-10 22:33:41,002 FATAL [main] SHELL-001 - 原因不明のエラー
2011-08-10 22:33:41,002 INFO [main] SHELL-001 - ファイルを5件取得
2011-08-10 22:33:41,002 WARN [main] SHELL-001 - ファイルの内容が一部不正
2011-08-10 22:33:41,002 ERROR [main] SHELL-001 - ファイルの読み込みに失敗
2011-08-10 22:33:41,002 FATAL [main] SHELL-001 - 原因不明のエラー
サンプルのダウンロード
サンプル一式(zip)
文字コードUTF-8、改行コードLFです。
更新履歴
2011/08/13 本ページ新規追加
TOP →
IT関連覚え書き →
シェル(Shell)サンプル → This Page