捕获标准错误和标准输出的好方法

时间:2013-02-08 21:54:28

标签: linux bash shell unix logging

这很有效,除了它将标准错误流合并到源代码脚本的标准输出流中。有关如何修复它的任何建议吗?

#!/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

这将从echo语句输出两行,显示两者都转到标准输出:

./t 2> /dev/null

是否有一种保存流的好方法,同时保留stdout / err语句的日志文件中的顺序?出于这个原因,我认为两个exec语句不是一个选项。

1 个答案:

答案 0 :(得分:1)

好先生,这应该有用

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

命令的clarify部分

|& was added to Bash 4 as an abbreviation for 2>&1 |