2013-02-08 117 views
1

除了將標準錯誤流合併到源文件腳本的標準輸出流之外,此功能很好。有關如何修復它的任何建議?捕獲標準錯誤和標準輸出的好方法

#!/usr/bin/env bash 

# Source this from a script to capture and `tee` standard error and standard 
# out to a log file. Calling script must source this script. For Example: 
# 
# . /usr/bin/logy /var/log/project/$0.log 
# 
# The logging uses >(process substitution). Process substitution is supported 
# in shells like bash and zsh but is not supported in sh. 

_LOG=${1?log file} 
test $# -eq 1 || exit 1 

mkdir -p "$(dirname "$_LOG")" 

# Append stdout and stderr to log file 
exec > >(
    echo -e "START\t$(date)" >> "$_LOG" 
    tee -a "$_LOG" 
    echo -e "END\t$(date)" >> "$_LOG" 
) 2>&1 

下面是一個例子:

. /usr/bin/logy $0.log 
echo stdout 
echo stderr >&2 
exit 1 

運行腳本:

$ ./t 
$ echo $?  # $? is the return value 
1 

好,則返回值1被保留下來......

什麼記錄?

$ cat t.log 
START Thu, Feb 07, 2013 2:58:57 PM 
stdout 
stderr 
END Thu, Feb 07, 2013 2:58:57 PM 

的想法是讓一個日誌文件,然後使用logrotate維護他們。

這裏是問題。標準的輸出和錯誤流被合併。該輸出指出表明標準錯誤流去到標準輸出:

./t > /dev/null 

這輸出從回聲報表顯示兩人來到標準出兩條線:

./t 2> /dev/null 

是否有保留的好方法在保留stdout/err語句的日誌文件中的順序的同時保存流?出於這個原因,我不認爲兩個exec陳述是一個選項。

+1

短的答案的一部分:沒有。簡單地將腳本(和錯誤流)的輸出複製到文件中是* not * logging。環繞它的日期不會記錄日誌。格式化它不會記錄。輸出是輸出,錯誤消息是錯誤消息,並且日誌是日誌。他們是不同的東西。 – 2013-02-08 22:00:14

+0

好的,我會解決我的問題...你說得很好,我需要縮小這個要求。這不是一個模型日誌記錄的例子,我們只需要一種方法來觀察正在發生的一切。 – jcalfee314 2013-02-08 22:03:51

+1

(1)我會注意到,進程替換不是隻有bash的特性。 [zsh](http://www.zsh.org/)也支持它。 (2)你的問題是什麼?它看起來像你的腳本按設計工作... – Celada 2013-02-08 22:52:29

回答

1

好先生,這應該工作

script_name.sh |& tee -a /var/log/script_name.sh.log 

clarify命令

|& was added to Bash 4 as an abbreviation for 2>&1 | 
相關問題