【问题标题】:Run Linux (Mint / Ubuntu / Debian) GNOME system notifications from log file text从日志文件文本运行 Linux (Mint / Ubuntu / Debian) GNOME 系统通知
【发布时间】:2022-01-17 12:36:11
【问题描述】:

我正在运行 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 运行?

【问题讨论】:

  • @waltinator 您能否就 syslog 如何解决此问题提供更多指导?在我看来,您似乎是在暗示在日志文件的(一些过滤的?)内容上使用logger,但这缺少......这里的大多数......问题。评论是为了澄清问题,而不是像“阅读手册页”这样的花絮。
  • github.com/birdie-github/useful-scripts/blob/master/… 对不起,我没有心情为你调整它。这个已经花了我很多工作了。
  • 嗨@waltinator 感谢您的意见,但平心而论,要求我阅读广泛流程的文档并不是真正的答案或澄清吗?另外,“准备学习经验”和“利用自己”听起来有点傲慢和不愉快。我认为这是一个提出具体问题(我觉得我已经做到了)和/或提供具体答案的地方。
  • @the_t_test_1 它是,你有。您没有做错任何事,其他用户不合时宜且粗鲁无礼。

标签: shell ubuntu linux-mint gnome cinnamon


【解决方案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 &lt;log file&gt; 将显示附加到文件的任何新行(忽略文件的开头),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 在 cmets 中发布了来自 github 的 script,这或多或少地按照我的建议进行,只是它从 journalctl 读取数据而不是文件。您可以查看那里以获取更多想法。

【讨论】:

  • 这看起来正是我想要的...但是我似乎无法让 shell 脚本甚至尾随日志文件...我在文本编辑器 (xe) 中打开日志文件并每次我用新行保存时,tail 都找不到它们/输出它们。如果我能过去,它应该可以工作?! (谢谢!!!)
  • @the_t_test_1,我假设这些日志通常不是由编辑器编辑的,但是有些东西会向它们添加行。为了正确测试它,只需将这些行附加到日志文件的末尾:echo "New line" &gt;&gt; &lt;log file&gt;"。此外,您可以在tail 命令中使用-F 而不是-f,以防发生某种日志轮换,并且文件可能会以相同的名称但不同的inode 重新创建。
  • 天哪,它有效。谢谢!现在我只需要了解如何确保 shell 脚本始终作为某种进程运行。我应该把它放在启动应用程序中,还是一些花哨的 systemd 东西?
  • 我认为这并不重要,只要确保它在您的帐户下运行(而不是以 root 身份),并且您有显示设置(请参阅@ArtemS.Tashkinov's script 以大致了解如何如果脚本以root身份执行,它应该看起来像)。
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 2014-04-22
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
相关资源
最近更新 更多