、私たちはこのように小さいのロギングライブラリーを構築することができ:
declare -A _log_levels=([FATAL]=0 [ERROR]=1 [WARN]=2 [INFO]=3 [DEBUG]=4 [VERBOSE]=5)
declare -i _log_level=3
set_log_level() {
level="${1:-INFO}"
_log_level="${_log_levels[$level]}"
}
log_execute() {
level=${1:-INFO}
if (($1 >= ${_log_levels[$level]})); then
"${@:2}" >/dev/null
else
"${@:2}"
fi
}
log_fatal() { ((_log_level >= ${_log_levels[FATAL]})) && echo "$(date) FATAL $*"; }
log_error() { ((_log_level >= ${_log_levels[ERROR]})) && echo "$(date) ERROR $*"; }
log_info() { ((_log_level >= ${_log_levels[INFO]})) && echo "$(date) INFO $*"; }
log_debug() { ((_log_level >= ${_log_levels[DEBUG]})) && echo "$(date) DEBUG $*"; }
log_verbose() { ((_log_level >= ${_log_levels[VERBOSE]})) && echo "$(date) VERBOSE $*"; }
# functions for logging command output
log_debug_file() { ((_log_level >= ${_log_levels[DEBUG]})) && [[ -f $1 ]] && echo "=== command output start ===" && cat "$1" && echo "=== command output end ==="; }
log_verbose_file() { ((_log_level >= ${_log_levels[VERBOSE]})) && [[ -f $1 ]] && echo "=== command output start ===" && cat "$1" && echo "=== command output end ==="; }
はのは、上記のソースはlogging_libと呼ばれるライブラリファイルであるとしましょう。SH、我々は通常のシェルスクリプトでこのようにそれを使用することができます:
#!/bin/bash
source /path/to/lib/logging_lib.sh
set_log_level DEBUG
log_info "Starting the script..."
# method 1 of controlling a command's output based on log level
log_execute INFO date
# method 2 of controlling the output based on log level
date &> date.out
log_debug_file date.out
log_debug "This is a debug statement"
...
log_error "This is an error"
...
log_fatal "This is a fatal error"
...
log_verbose "This is a verbose log!"
は、この出力になります:
Fri Feb 24 06:48:18 UTC 2017 INFO Starting the script...
Fri Feb 24 06:48:18 UTC 2017
=== command output start ===
Fri Feb 24 06:48:18 UTC 2017
=== command output end ===
Fri Feb 24 06:48:18 UTC 2017 DEBUG This is a debug statement
Fri Feb 24 06:48:18 UTC 2017 ERROR This is an error
Fri Feb 24 06:48:18 UTC 2017 FATAL This is a fatal error
我々が見ることができるように、log_verbose
は、ログレベル以来、任意の出力を生成しませんでしたVERBOSEの1レベル下のDEBUGにあります。しかし、log_debug_file date.out
は出力を生成したので、ログレベルは> = INFOのDEBUGに設定されているので、log_execute INFO
を出力しました。所定の位置にこれらと
git_wrapper() {
# run git command and print the output based on log level
}
、スクリプトが判断できる引数--log-level level
を取るように強化することができます。
ベースとして、これを使用して、我々はまた、我々はさらに多くの微調整が必要な場合は、コマンドのラッパーを書くことができますそれを実行する必要があるログの冗長性。
誰でもいくつかの変数が有力で命名されている理由について興味ある場合は、上記のコードでアンダースコア、この記事を参照してください。
あなたは '-x設定使用して考えがあります'?スクリプトの一番上でこのコマンドを呼び出すと、それ以降のすべてのコマンドがエコーされます。あなたは 'set + x'でそれをオフにすることができます。 –
さらに、コマンドが0以外のステータスで終了したときにスクリプトを中止するには、 'set -e'を使用することもできます。 –
いいえ、それは私が必要なものではありません。私はどのコマンドを実行しているのか知っています。私は、スクリプトがいくつかのオプションに応じて出力するすべてのものを印刷するようにしたいだけです。それは実際のコードよりもユーザーのものです。 – Ocab19