从日志文件文本运行 Linux (Mint / Ubuntu / Debian) GNOME 系统通知

从日志文件文本运行 Linux (Mint / Ubuntu / Debian) GNOME 系统通知

我正在运行 Linux Mint 20.2(Mint 来自 ubuntu 通过 Debian)。

我有一个来自 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 运行?

答案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 通知。

如果你想过滤特定行,只需添加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.塔什基诺夫发表在评论a脚本来自 github 的内容或多或少按照我的建议进行,只是它从journalctl文件中读取数据。您可以在那里寻找更多想法。

相关内容