2016-04-04 36 views
0

我有一個日誌功能:慶典 - 重定向STDERR到日誌功能

log() { 
    if [[ "$#" -ne 2 ]];then 
     printf "[%s] %s\n" 'error' 'log function requires two arguments' 
     printf "%s\n" 'usage: log [level] "message"' 
     printf "%s\n" 'e.g: log error "this is my error"' 
     exit 1 
    elif [[ "$1" == 'info' ]]; then 
     printf "[%s] %s: %s %s\n" "info" "$(basename $0)" "$curr_date" "${2}" &> >(tee -a "$log_file") 
    elif [[ "$1" == 'warn' ]]; then 
     printf "[%s] %s: %s %s\n" "warn" "$(basename $0)" "$curr_date" "${2}" &> >(tee -a "$log_file") 
    elif [[ "$1" == 'error' ]]; then 
     printf "[%s] %s: %s\n" "error" "$(basename $0)" "$curr_date" "${2}" &> >(tee -a "$log_file") 
    elif [[ "$1" == 'debug' ]]; then 
     printf "[%s] %s: %s %s\n" "debug" "$(basename $0)" "$curr_date" "${2}" &> >(tee -a "$log_file") 
    else 
     printf "[%s] %s %s\n" 'error' 'unable to log with level' "'${1}'" 
     printf "%26s '%s' '%s' '%s' '%s'\n" 'allowed levels are' 'info' 'warn' 'error' 'debug' 
    fi 
} 

這是一個外部文件,並在任何腳本需要它來源:

source log 

我想如果可能的話,將STDERR重定向到log error <message>,以便我不必檢查每個命令的每個命令退出代碼是否有錯誤。類似於exec 2> log error,以便捕獲每條錯誤消息。

任何幫助表示讚賞

感謝

+0

如果您想將標準錯誤重定向到該功能,那麼我認爲您需要重定向,可能使用[進程替換](https://www.gnu.org/software/bash/manual/bash.html #Process-Substitution)寫入'while read -r line;做日誌「$ line」;完成「操作。主要的注意事項是,如圖所示,日誌函數獲取單個長字符串參數。但是,不清楚使用'do log $ line是否安全;完成「,而不是因爲您不知道錯誤消息中可能包含什麼內容。我試圖使用一個Perl腳本或類似的接收和解析並記錄信息。 –

回答

4

建立一個trap低於日誌函數的定義:

# define a trap function 
error_handler() { 
    log error "I got an error on line:${1}, exit status of last command: ${2}" 
    trap - ERR 
} 

# activate the trap 
trap 'error_handler ${LINENO} $?' ERR 

#### paste in the following your commands 

編輯:trap - ERR下降的陷阱,如果你打算使用陷阱多次(如果您的腳本在第一次錯誤後沒有終止),請對其進行評論。

+0

'陷阱-ERR'在最後做了什麼? – SaintHax

+0

@Simone:令人驚歎。你改變了我的生活。謝謝 – user6127511

+1

@SaintHax我添加了一個關於你的問題的編輯。 – Simone