我正在运行 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 ...但这绝对显示了所有内容,我什至不会注意到正在发生什么事件)。
所以:
有没有办法从日志文件中运行系统通知?例如让它在文件的每个新行上发出通知?
假设这是可能的,那么我是否可以过滤以仅显示以“删除”、“上传”或其他我想要的通知开头开头的行?
我猜测没有 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 通知。
如果你想过滤特定行,只需添加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.塔什基诺夫发表在评论a脚本来自 github 的内容或多或少按照我的建议进行,只是它从journalctl
文件中读取数据。您可以在那里寻找更多想法。