Shell-Script
POSIX Shell:使用函式輸出到日誌並在行前添加時間戳
我想要一個 shell 腳本將它的所有輸出
stdout
和stderr
記錄到一個外部文件中,並在每行前面加上時間戳(加上一些額外的項目),而不改變腳本的呼叫方式。輸出重定向應該發生在腳本本身內。我也不應該單獨更改腳本或管道命令中的任何現有程式碼。理想情況下,我只需要在腳本中添加幾行。使用這兩個答案:
我已經到了它在 Bash 上工作的地步
#! /usr/bin/env bash CUSTOM_PREFIX1="FancyScript" CUSTOM_PREFIX2="SomeRunID_12-3-4.5" LOG_FILE="/var/log/script.log" touch $LOG_FILE exec 1>> >(while IFS= read -r line; do printf '[%s] %s %s: %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "${CUSTOM_PREFIX1}" "${CUSTOM_PREFIX2}" "${line}"; done >> "${LOG_FILE}") exec 2>&1 # Script continues... d echo "Hello"
執行上面的腳本不會產生任何輸出和以下日誌文件:
# cat /var/log/script.log [2022-02-23 03:11:45] FancyScript SomeRunID_12-3-4.5: Development/shell_log.sh: line 12: d: command not found [2022-02-23 03:11:45] FancyScript SomeRunID_12-3-4.5: Hello
到目前為止一切順利,但我想改變兩件事。
- 讓它在 POSIX shell (
sh
) 中工作而不依賴於 Bash。普通人sh
不喜歡exec 1>> >(...)
- 而不是那個長的子過程,
(while IFS= read ....)
我想將它傳遞給腳本本身的一個函式。就像是pipe_log() {...}
我認為
logger
是專門為此編寫的:寫入系統日誌文件。有關詳細資訊,請參閱上面該實用程序的
logger(1)
手冊 (man logger
) 和指向 POSIX 規範的連結。