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

Gal*_*let 1 bash shell logging timestamp

我目前正在使用以下来记录标准输出和标准错误。我想记录回显语句和时间戳。

exec 3>&1 1>>${LOG_FILE} 2>&1
Run Code Online (Sandbox Code Playgroud)

我如何使用 shell 实现它

use*_*502 6

根据您可能需要该ts 实用程序的确切预期行为。

% echo message | ts
Apr 16 10:56:39 message
Run Code Online (Sandbox Code Playgroud)

你也可以别名echo.

% sh
$ alias echo='echo $(date)'
$ echo message
Mon Apr 16 10:57:55 UTC 2018 message
Run Code Online (Sandbox Code Playgroud)

或者让它成为一个shell函数。

#!/bin/sh

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

echo message
Run Code Online (Sandbox Code Playgroud)


cda*_*rke 5

这里我使用一个函数来简化该行,但要寻找的主要内容是进程替换,这就是>(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
Run Code Online (Sandbox Code Playgroud)

该示例放入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
Run Code Online (Sandbox Code Playgroud)

您可能希望更改裸机$(date)以使用更好的格式。如果您运行的是 bash 4.2 或更高版本,您可以使用printf它,这会更有效,例如,而不是echo

# -1 means "current time"
printf "%(%Y-%m-%d %T)T %s\n" -1 "$REPLY"  >> ${LOG_FILE}
Run Code Online (Sandbox Code Playgroud)

给出:

2018-04-16 09:26:50 Hello world
2018-04-16 09:26:50 ls: does_not_exist: No such file or directory
Run Code Online (Sandbox Code Playgroud)