捕获标准错误和标准输出的好方法
问题描述:
除了将标准错误流合并到源文件脚本的标准输出流之外,此功能很好。有关如何修复它的任何建议?捕获标准错误和标准输出的好方法
#!/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
陈述是一个选项。
答
好先生,这应该工作
script_name.sh |& tee -a /var/log/script_name.sh.log
要clarify命令
|& was added to Bash 4 as an abbreviation for 2>&1 |
短的答案的一部分:没有。简单地将脚本(和错误流)的输出复制到文件中是* not * logging。环绕它的日期不会记录日志。格式化它不会记录。输出是输出,错误消息是错误消息,并且日志是日志。他们是不同的东西。 – 2013-02-08 22:00:14
好的,我会解决我的问题...你说得很好,我需要缩小这个要求。这不是一个模型日志记录的例子,我们只需要一种方法来观察正在发生的一切。 – jcalfee314 2013-02-08 22:03:51
(1)我会注意到,进程替换不是只有bash的特性。 [zsh](http://www.zsh.org/)也支持它。 (2)你的问题是什么?它看起来像你的脚本按设计工作... – Celada 2013-02-08 22:52:29