在控制台中打印错误,在日志文件中同时打印错误和输出-UNIX

我有一个带有两个运行时参数的shell脚本。在执行过程中,如果出现任何错误,则需要将其重定向到错误文件并在控制台中。同样,错误和输出都需要重定向到日志文件。

当前,错误输出将被复制到err文件并也显示在控制台中。 但是在日志文件中,输出和错误消息被重定向了两次。

Code

#! /bin/sh    
errExit ()
{
    errMsg=`cat $1.log >> "$1".err`
    cat "$1".err | tee /dev/fd/3    
   return
}

test()
{
logfile=$1
exec 3>&1 1>>"${logfile}".log 2>&1
echo "$1"
echo "$2"
echo " "
echo "#################################################"
echo "Hi Hello,This is first function"
echo "#################################################"
if [[ -z "$2" ]];
then 
errExit $logfile
return
else
#<some Commands Here>
fi
}

test_1()
{
logfile=$1
exec 3>&1 1>>"${logfile}".log 2>&1
echo "$1"
echo "$2"
echo " "
echo "#################################################"
echo "Hi Hello,This is second function"
echo "#################################################"
if [[ -z "$2" ]];
then 
errExit $logfile
return
else
#<some Commands Here>
fi
}
chengnuo2020 回答:在控制台中打印错误,在日志文件中同时打印错误和输出-UNIX

我不确定脚本某些部分的用途,也不确定您要记录的内容以及原因,但是我将很快进行说明。

您当前的日志记录

当前记录有点logging回。 3点指向控制台,而2点指向1之后1重定向到您的日志文件。如果发生错误,则将整个日志复制到一个错误文件中,然后使用tee发布整个错误文件。根据设计,Tee会打印到1(不是控制台)以及您指定的任何文件,因此,当您将错误文件(即整个日志)发布到1和3时,它将在控制台中打印(3),但还会添加整个日志到日志。本质上,您已经四处移动了,因此tee不再能按预期工作并且变得无关紧要。另外,由于您使用exec来更改管道,因此这些更改将持续到整个脚本,可能会干扰输出。

我的推荐

我建议您保留输出流的功能以避免混淆。您可以通过将日志记录添加到函数调用中来完全从函数中删除日志记录。因此,如果您的函数调用以前是test log_filename other_arg,则可以将其更改为test other_arg | tee log_filename.log。这会将所有内容发布到终端,但是stdout也将被记录。您可能更喜欢

LOG=log_filename
test other_arg 2>&1 | tee "${LOG}.log"

,以便日志包含stderr。这也将使您的errExit函数只需要这样:

errExit ()
{
    errMsg=`cp "${LOG}.log" "${LOG}.err"` # No useless cat calls ;)
    return
}

作为附带的好处,由于2>&1重定向位于函数调用中,因此脚本输出的其余部分将恢复为正常行为。尽管我没有发布它,但是您需要修改函数以不再期望或将日志文件作为第一个参数来处理。

最简单的解决方法

如果您只是想以最少的重构来修复代码,或者不希望总是将所有内容打印到控制台,只需将errExit函数的第二行从cat "$1".err | tee /dev/fd/3更改为cat "$1".err >&3

如果您有反馈意见,我可以根据您的日志记录需求量身定制答案:)

本文链接:https://www.f2er.com/3097416.html

大家都在问