如何在shell脚本中使用时间戳记录echo语句

时间:2018-04-16 07:38:37

标签: bash shell logging timestamp

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

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

如何使用shell

实现它

3 个答案:

答案 0 :(得分:1)

这里我使用的函数来简化这一行,但要找的主要是进程替换,这就是>(log_it)语法。 REPLYread使用的默认变量。

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

示例放入logfile

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

您可能希望更改裸$(date)以使用更好的格式。如果您运行的是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

给出:

{{1}}

答案 1 :(得分:1)

根据您可能需要的确切行为ts 效用

% echo message | ts
Apr 16 10:56:39 message

你也可以别名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

答案 2 :(得分:0)

太棒了,谢谢@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回答。)