2013-02-08 97 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 | 
相关问题