Bash 如何在shell脚本中记录带有时间戳的echo语句

Bash 如何在shell脚本中记录带有时间戳的echo语句,bash,shell,logging,timestamp,Bash,Shell,Logging,Timestamp,我目前正在使用以下命令来记录stdout和stderr。我想记录echo语句和时间戳 exec 3>&1 1>>${LOG_FILE} 2>&1 如何使用shell来实现它这里我使用一个函数来简化代码行,但是要寻找的主要内容是进程替换,这就是>(log\it)语法REPLY是read使用的默认变量 logit() { while read do echo "$(date) $REPLY" >> ${LOG_FI

我目前正在使用以下命令来记录stdout和stderr。我想记录echo语句和时间戳

exec 3>&1 1>>${LOG_FILE} 2>&1

如何使用shell来实现它这里我使用一个函数来简化代码行,但是要寻找的主要内容是进程替换,这就是
>(log\it)
语法
REPLY
read
使用的默认变量

logit() {
    while read
    do
        echo "$(date) $REPLY" >> ${LOG_FILE}
    done
}

LOG_FILE="./logfile"

exec 3>&1 1>> >(logit) 2>&1

echo "Hello world"
ls -l does_not_exist
该示例将以下内容放入
日志文件中:

Mon 16 Apr 2018 09:18:33 BST Hello world
Mon 16 Apr 2018 09:18:33 BST ls: does_not_exist: No such file or directory
您可能希望更改裸
$(日期)
以使用更好的格式。如果您运行的是bash 4.2或更高版本,则可以使用
printf
,例如,这将比
echo
更有效:

# -1 means "current time"
printf "%(%Y-%m-%d %T)T %s\n" -1 "$REPLY"  >> ${LOG_FILE}
给出:

2018-04-16 09:26:50 Hello world
2018-04-16 09:26:50 ls: does_not_exist: No such file or directory

在这里,我使用一个函数来简化行,但要寻找的主要内容是进程替换,即
>(log\u it)
语法
REPLY
read
使用的默认变量

logit() {
    while read
    do
        echo "$(date) $REPLY" >> ${LOG_FILE}
    done
}

LOG_FILE="./logfile"

exec 3>&1 1>> >(logit) 2>&1

echo "Hello world"
ls -l does_not_exist
该示例将以下内容放入
日志文件中:

Mon 16 Apr 2018 09:18:33 BST Hello world
Mon 16 Apr 2018 09:18:33 BST ls: does_not_exist: No such file or directory
您可能希望更改裸
$(日期)
以使用更好的格式。如果您运行的是bash 4.2或更高版本,则可以使用
printf
,例如,这将比
echo
更有效:

# -1 means "current time"
printf "%(%Y-%m-%d %T)T %s\n" -1 "$REPLY"  >> ${LOG_FILE}
给出:

2018-04-16 09:26:50 Hello world
2018-04-16 09:26:50 ls: does_not_exist: No such file or directory

根据具体的预期行为,您可能需要
ts
效用

您还可以使用别名
echo

% sh
$ alias echo='echo $(date)'
$ echo message
Mon Apr 16 10:57:55 UTC 2018 message
或者让它成为一个shell函数

#!/bin/sh

echo() {
    command echo $(date) "$@"
}

echo message

根据具体的预期行为,您可能需要
ts
效用

您还可以使用别名
echo

% sh
$ alias echo='echo $(date)'
$ echo message
Mon Apr 16 10:57:55 UTC 2018 message
或者让它成为一个shell函数

#!/bin/sh

echo() {
    command echo $(date) "$@"
}

echo message

太棒了,谢谢@cdarke!我现在正在使用类似于以下的东西,以便在我的脚本的主要部分有更细粒度的控制—它记录我想要的一切,并且我仍然可以看到stdout:

logouts() {
    while read
    do
        printf "%(%T)T %s\n" -1 "stdout: $REPLY"  | tee -a ${LOG_FILE}
    done
}
logerrs() {
    while read
    do
        printf "%(%T)T %s\n" -1 "stderr: $REPLY"  >> ${LOG_FILE}
    done
}
LOG_FILE="./logfile"

main()
{
    echo "Hello world" 1>> >(logouts) 2>> >(logerrs)
    ls -l does_not_exist 1>> >(logouts) 2>> >(logerrs)
}
main "$@"

(向@cdarke道歉:我无法将其格式化为评论-如果您觉得有用,请向@cdarke回复投票。)

太棒了,谢谢@cdarke!我现在正在使用类似于以下的东西,以便在我的脚本的主要部分有更细粒度的控制—它记录我想要的一切,并且我仍然可以看到stdout:

logouts() {
    while read
    do
        printf "%(%T)T %s\n" -1 "stdout: $REPLY"  | tee -a ${LOG_FILE}
    done
}
logerrs() {
    while read
    do
        printf "%(%T)T %s\n" -1 "stderr: $REPLY"  >> ${LOG_FILE}
    done
}
LOG_FILE="./logfile"

main()
{
    echo "Hello world" 1>> >(logouts) 2>> >(logerrs)
    ls -l does_not_exist 1>> >(logouts) 2>> >(logerrs)
}
main "$@"

(向@cdarke道歉:我无法将其格式化为评论-如果您觉得有用,请向@cdarke-answer投票。)

我想将其存储在一个文件中。如何使用它。我想把它存储在一个文件中。如何使用它。下面是bash日志记录的全面实现:下面是bash日志记录的全面实现: