$ journalctl -b
...
Mar 23 18:18:50 alan-laptop pkexec[31408]: pam_unix(polkit-1:session): session opened for user root by (uid=1001)
Mar 23 18:19:47 alan-laptop org.gnome.Shell.desktop[1711]: libinput error: client bug: timer event5 debounce short: offset negative (-3ms)
...
我将第一行理解为来自 PID 31408 的日志消息,它是该pkexec
命令的一个实例。
但我 100% 确定我没有org.gnome.Shell.desktop
在任何地方调用可执行文件。确实存在具有该名称的文件,但它是 XDG 桌面文件。
$ find -xdev -name 'org.gnome.Shell.desktop*' 2>/dev/null
./usr/share/applications/org.gnome.Shell.desktop
$ ls -l ./usr/share/applications/org.gnome.Shell.desktop
-rw-r--r--. 1 root root 8179 Jan 22 10:19 ./usr/share/applications/org.gnome.Shell.desktop
问题
为什么不显示此日志消息gnome-shell[1711]
?
这是如何实施的?
有人认为这样会更有用吗?如果是这样,为什么?
环境
软呢帽27
- systemd-234-10.git5f8984e.fc27.x86_64
- gnome-session-3.26.1-1.fc27.x86_64
答案1
TL;DR:是 GNOME Shell 决定这样做的。他们在同一进程内运行多个应用程序(小程序),因此他们决定使用 XDG 菜单规范作为附加到消息的“标签”。
完整解释如下...
因此,日志会合成类似于系统日志的消息,您可以从与每条消息一起存储的内部字段中看到该消息。 (您可以使用格式查看内部字段-o verbose
。)
通常带有程序名称的字段,也称为“标签”,存储在系统日志_标识符场地。
(其他程序使用 SYSLOG_IDENTIFIER。例如,logger
默认情况下会从调用它的用户发送标签,您可以使用该-t
选项覆盖它。)
登录日志的方式主要有 3 种:使用传统的方式系统日志(3)接口,通过从 systemd 服务写入 stdout 或 stderr,或使用本机日志接口。
GNOME Shell 使用本机日志接口,特别是sd_journal_stream_fdAPI。该函数采用标识符作为第一个参数,然后将其用作通过该流发送的消息的 SYSLOG_IDENTIFIER。
初始化日志流的 GNOME Shell 代码可以在src/shell-app.c,并且追溯到appid
调用者的使用表明它是使用设置的g_app_info_get_id。
查找 g_app_info_get_id,您会发现该 ID 是特定于平台的,但“在 Unix 上,这是 xdg 菜单规范中的桌面文件 id”,这与您所观察到的内容相匹配。
src/shell-app.c 中的代码前面有一条注释,解释了其基本原理:
/* This sets up the launched application to log to the journal
* using its own identifier, instead of just "gnome-session".
*/
换句话说,GNOME Shell 运行多个应用程序(通过小程序),因此 GNOME Shell 开发人员认为在日志消息中使用 XDG 菜单规范会更合适,这样您就可以知道哪个小程序正在生成它......
这些日志记录流也可以由任何子进程继承,例如 Xwayland。在这种情况下,标签后面的 PID 似乎指的是 gnome-shell,即打开stream_fd 的进程,而不是向 fd 写入消息的子进程。下面的日志消息显示 Xwayland 服务器崩溃,但 PID 3493 是 gnome-shell 的 PID,而不是 Xwayland。
3 月 17 日 18:08:39 alan-laptop org.gnome.Shell.desktop[3494]:(EE)捕获信号 7(总线错误)。服务器中止