從日誌文件文本執行 Linux (Mint / Ubuntu / Debian) GNOME 系統通知
我正在執行 Linux Mint 20.2(Mint 通過 Debian 來自 ubuntu)。
我有一個來自 abraunegg 的 onedrive 客戶端的日誌文件,它輸出這樣的內容(onedrive 客戶端通過 systemd 不斷執行):
2022-Jan-16 14:40:14.9203443 Starting a sync with OneDrive 2022-Jan-16 14:40:14.9206537 Syncing changes from OneDrive ... 2022-Jan-16 14:40:16.1507118 Sync with OneDrive is complete 2022-Jan-16 14:40:40.7630634 Retry sync count: 1: Cannot open file `./Untitled Document' in mode `rb' (No such file or directory) 2022-Jan-16 14:40:41.4198398 Moving ./Untitled Document to ./linux_mint_is_great.txt 2022-Jan-16 14:40:41.9391852 Uploading new file ./linux_mint_is_great.txt ... done. 2022-Jan-16 14:40:45.4773655 Uploading new file ./linux_mint_is_great (copy).txt ... done. 2022-Jan-16 14:40:47.8734736 Uploading new file ./linux_mint_is_great (another copy).txt ... done. 2022-Jan-16 14:40:48.1857814 Starting a sync with OneDrive 2022-Jan-16 14:40:48.186048 Syncing changes from OneDrive ... 2022-Jan-16 14:40:49.4558493 Sync with OneDrive is complete 2022-Jan-16 14:40:59.2265195 Deleting item from OneDrive: ./linux_mint_is_great (copy).txt 2022-Jan-16 14:40:59.3837201 Deleting item from OneDrive: ./linux_mint_is_great.txt 2022-Jan-16 14:40:59.5461714 Deleting item from OneDrive: ./linux_mint_is_great (another copy).txt
客戶端被配置為將一些日誌事件輸出到系統通知,但只有非常關鍵的事件(例如無法連接到 onedrive),並且沒有通知其他問題的選項(並且沒有計劃這樣做)。
我的所有事件的日誌文件都在
home/john/.config/onedrive/john.onedrive.log
我想要的是將我的系統配置為在上面的日誌文件中顯示事件通知,例如“上傳新文件…”、“從 OneDrive 中刪除項目…”以及我想要顯示的其他事項(替代方法是在日誌上執行 -tail ……但這絕對顯示了所有內容,我什至不會注意到發生了什麼事件)。
所以:
- 有沒有辦法從日誌文件中執行系統通知?例如讓它在文件的每個新行上通知?
- 假設這是可能的,那麼我是否可以僅過濾以顯示以“刪除”、“上傳”或其他開頭的行來獲取我想要的通知?
我猜沒有GUI工具可以做到這一點(通知設置沒有顯示這種定制的選項)……但也許某種shell腳本讀取日誌文件並以某種方式將相關行發送到系統通知應用程序?然後也許讓shell腳本在啟動時執行或通過systemd執行?
首先,對於 GUI 通知,您可以使用
notify-send
. 執行它的“標準”方式是notify-send <summary> [body]
,您可以更改過期時間、緊急程度、類別等。現在,為了通知某個日誌文件中出現的每個新行,您可以執行以下命令:
tail -n -0 -f <log file> | while read line; do notify-send "Notification from <log file>" "$line"; done
tail -n -0 -f <log file>
將顯示附加到文件的任何新行(忽略文件的開頭),並且while
循環將向您的每一行顯示發送一個 GUI 通知。如果要過濾特定行,只需添加
grep
到tail
命令中。例如,如果要顯示以“Deleting”、“Uploading”開頭的行:tail -n -0 -f <log file> | grep --line-buffered -e ^Deleting -e ^Uploading | while read line; do notify-send "Notification from <log file>" "$line"; done
該
--line-buffered
標誌將確保grep
在模式出現後立即輸出與模式匹配的行,而無需進一步緩衝。當然,在
while
循環內部你可以添加添加邏輯,根據內容$line
來改變notify-send
參數(改變緊急程度,過期等)。更新
僅在發布答案後,我才注意到@ArtemS.Tashkinov在評論中發布了來自 github 的腳本,該腳本或多或少地按照我的建議進行,只是它正在讀取數據
journalctl
而不是文件。你可以看看那裡採取更多的想法。