我寫了一個大型的Bash程序,它由幾個在整個深層目錄樹中組織的shell腳本組成。該程序非常複雜,擁有熟練的調試和日誌記錄基礎架構至關重要。 在其中一個子腳本中,我編寫了一個記錄器函數,該函數能夠接收日誌消息,並將這些日誌消息路由到適當的MySQL表。腳本範圍重定向到內部記錄器功能
記錄器功能具有隻接受一個參數,日誌消息,並且可以被想象爲echo
內置直接打印到數據庫中,與正被內部確定路由的一個特殊版本的純簡單的輸入接口。 在代碼這轉化爲:
# generic code, somewhere in the program
if success; then
log_f "Previous function returned success"
else log_f "Previous function returned failure"
fi
這種方法具有可僅能夠登錄被明確地意在直通log_f
那些消息的缺陷;也就是說,外部二進制文件或Bash本身生成的任何錯誤消息都不會保存在數據庫中。
一個簡單的解決方案可能沿着exec >log 2>&1
行,這將註冊從標準輸入和標準錯誤到log
。但是,我需要將日誌消息存儲在數據庫中而不是文件中。
另外,exec
似乎與管道重定向不兼容,如exec | log_f
。 (log_f修改爲支持stdin)。 我能想到的唯一的解決辦法,這是醜陋的,是他們的調用過程中可以設置整個腳本(S)的重定向,如:
# I am a starter of sub-scripts
a_script_in_the_tree.sh 2>&1 | log_f
然而,這將是最好讓每個腳本管理其自己的內部日誌記錄方法,使用其範圍內可用的自己的一組函數。
您是否知道'{cmd1; ...; } | log_f'?它處理大括號範圍內的代碼的I/O重定向,與'exec'類似,但並不像'exec'那樣激進 - 可用於管道(關於設置和讀取變量的位置的注意事項)。 –
如果我想收集腳本中的所有輸出,這將需要將程序的幾乎每個和每個命令分別管理給記錄器。一個瘋狂的恕我直言。 – davide
我剛剛意識到整個腳本可以放在'{}'內,除了'log_f'的定義。但是,我有全局變量,唉。 – davide