Shell-Script

POSIX Shell:使用函式輸出到日誌並在行前添加時間戳

  • February 23, 2022

我想要一個 shell 腳本將它的所有輸出stdoutstderr記錄到一個外部文件中,並在每行前面加上時間戳(加上一些額外的項目),而不改變腳本的呼叫方式。輸出重定向應該發生在腳本本身內。我也不應該單獨更改腳本或管道命令中的任何現有程式碼。理想情況下,我只需要在腳本中添加幾行。

使用這兩個答案:

我已經到了它在 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

到目前為止一切順利,但我想改變兩件事。

  1. 讓它在 POSIX shell ( sh) 中工作而不依賴於 Bash。普通人sh不喜歡exec 1>> >(...)
  2. 而不是那個長的子過程,(while IFS= read ....)我想將它傳遞給腳本本身的一個函式。就像是pipe_log() {...}

我認為logger是專門為此編寫的:寫入系統日誌文件。

有關詳細資訊,請參閱上面該實用程序的logger(1)手冊 ( man logger) 和指向 POSIX 規範的連結。

引用自:https://unix.stackexchange.com/questions/691856