Shell

從日誌文件文本執行 Linux (Mint / Ubuntu / Debian) GNOME 系統通知

  • January 25, 2022

我正在執行 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 ……但這絕對顯示了所有內容,我什至不會注意到發生了什麼事件)。

所以:

  1. 有沒有辦法從日誌文件中執行系統通知?例如讓它在文件的每個新行上通知?
  2. 假設這是可能的,那麼我是否可以僅過濾以顯示以“刪除”、“上傳”或其他開頭的行來獲取我想要的通知?

我猜沒有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 通知。

如果要過濾特定行,只需添加greptail命令中。例如,如果要顯示以“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而不是文件。你可以看看那裡採取更多的想法。

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