如何在日志中发送错误在shell脚本中添加日期?

时间:2014-07-14 13:16:22

标签: linux shell logging sh

我希望我的shell脚本中执行的命令的所有错误都写在日志文件中,这很简单

exec 2>> /var/log/mylog.txt

但如果我想在错误发生之前向每一行添加日期呢?

3 个答案:

答案 0 :(得分:2)

首先想到的选择是使用fifo和一些重定向:
我保持这个答案,因为它可能就足够了;但其他选项可用 - 请参阅我的其他答案

#!/bin/sh

TEMPDIR=`mktemp -d`
mkfifo "${TEMPDIR}/fifo"

(awk '{"date" | getline the_date; print the_date ": " $0; fflush() }' < "${TEMPDIR}/fifo" ) &
exec 2> "${TEMPDIR}/fifo"
rm -f "${TEMPDIR}/fifo"

#
# Your commands here
#

exec 2>&-

答案 1 :(得分:2)

如果您使用bash,则可以访问可能用于此目的的协同进程

#!/bin/bash

# The co-process responsible to add the date
coproc myproc {
       ( bash -c 'while read line; do echo $(date): ${line}; done' 3>&1 1>&2- 2>&3- )
}

# Redirect stderr to the co-process
exec 2>&${myproc[1]}

# Here my script -- classical; no (visible) redirection
ls non-existant-file1 existant-file non-existant-file2

将上述内容保存为t.sh

sh$ touch existant-file
sh$ ./t.sh 2> error.log
existant-file
sh$ cat error.log
Tue Jul 15 00:15:29 CEST 2014: ls: cannot access non-existant-file1: No such file or directory
Tue Jul 15 00:15:29 CEST 2014: ls: cannot access non-existant-file2: No such file or directory

答案 2 :(得分:1)

创建一个管道并通过perl脚本运行你的stderr。类似的东西:

#!/bin/sh

trap 'rm -f $F' 0 
F=$(mktemp)
rm $F
mkfifo $F

perl -ne 'print localtime() . ": " . $_' < $F >&2 &
exec 2> $F

如上所述,这会将时间戳和消息打印到脚本开始时的同一个stderr,因此您可以通过在脚本运行时重定向来附加到日志文件。或者,您可以在调用perl的行上对重定向进行硬编码。