如何编写一个简单的记录器,该记录器将时间,错误和标准输出写入文件

时间:2019-03-28 18:42:00

标签: bash

我想创建一个简单的命令,将日期/时间,错误和标准输出记录到文件中。因此,如果我将文件移动到文件夹并显示“权限被拒绝”,则文件中会出现一行,显示当前日期/时间以及错误。

我知道如何将标准输出和命令错误写入文件,但是如何添加时间?预先感谢!

3 个答案:

答案 0 :(得分:1)

所以您想像这样将stderr重定向到stdout:

2>&1

然后在每行的前面加上时间,就像这样(有点不客气,对不起):

sed "s/\(.\)/`date` \1/"

所以我们结束了这样的事情

2>&1 | sed "s/\(.\)/`date` \1/"

答案 1 :(得分:1)

以下一些代码可以提供帮助:

function add_date() {
    while IFS= read -r line; do
        echo "$(date): $line"
    done
}


{
# Your code here
} 2>&1 | add_date   >>   $LOGFILE

这会将日期添加到代码输出的每一行的开头(无论如何在大括号之间)。

输出缓冲可能存在一些问题。这将在日志文件中的所有行上显示为相同的时间戳。

这是上面应用的代码的示例:

: ${LOGFILE:=logfile}
function add_date() {
    while IFS= read -r line; do
        echo "$(date): $line"
    done
}


{
  for a in {1..10}
  do  
    echo $a
    sleep 2
  done

} 2>&1 | add_date   >>   $LOGFILE

结果:

$ cat logfile
Thu Mar 28 14:50:46 EDT 2019: 1
Thu Mar 28 14:50:48 EDT 2019: 2
Thu Mar 28 14:50:50 EDT 2019: 3
Thu Mar 28 14:50:52 EDT 2019: 4
Thu Mar 28 14:50:54 EDT 2019: 5
Thu Mar 28 14:50:56 EDT 2019: 6
Thu Mar 28 14:50:58 EDT 2019: 7
Thu Mar 28 14:51:00 EDT 2019: 8
Thu Mar 28 14:51:02 EDT 2019: 9
Thu Mar 28 14:51:04 EDT 2019: 10

答案 2 :(得分:1)

我使用一个函数来执行类似您所要求的操作

status_msg () {
   echo "`hostname --short`:`date '+%m_%d_%Y_%H_%M_%S'`: $*"
}

可以通过

调用上述函数
status_msg "This is a test line"

会导致

hostname:03_28_2019_13_50_31: This is a test line

或者,如果您正在运行产生输出的命令,则可以像这样使用它..

<command> 2>&1 | while read -r line
do
   status_msg $line
done