ログファイルテキストでLinux(Mint / Ubuntu / Debian)GNOMEシステム通知を実行する

ログファイルテキストでLinux(Mint / Ubuntu / Debian)GNOMEシステム通知を実行する

私はLinux Mint 20.2(Debianを介したUbuntuのMint)を実行しています。

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ツールはないようです(通知設定にはこれらのカスタマイズのオプションは表示されません)...しかし、ある種のシェルスクリプトがログファイルを読み取り、関連行をシステム通知アプリに送信するかもしれません。 ?それでは、起動時にシェルスクリプトを実行することも、systemdを介して実行することもできますか?

答え1

まず、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たとえば、「削除中」、「アップロード中」で始まる行を表示したい場合:

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コメントに投稿しましたスクリプトjournalctlgithubのものは、ファイルからデータを読み取ることを除いて、私が提案したものとほぼ同じです。そこでより多くのアイデアを見つけることができます。

関連情報