欢迎回到我们关于 systemd 的后续系列。 强大的启动和管理系统包含许多有用的功能。 一种是日志记录,它记录有关您的系统及其运行的服务的数据。 了解有关该期刊的更多信息有助于您在必要时轻松发现信息并排除故障。
基本期刊使用
journalctl 命令允许您与日志交互。 默认情况下,journalctl 会显示整个期刊内容:
journalctl
如果您不是 Linux 新手,您会记得旧系统使用 系统日志 记录日志数据。 您会注意到日志的输出看起来非常像 syslog 输出。 这是一个 example 从我的主人。 如果您不知道这意味着什么,请不要担心。 这些是来自最近引导系统的消息。
-- Logs begin at Fri 2015-11-06 16:55:01 EST, end at Tue 2015-11-10 17:01:23 EST. -- Nov 06 16:55:01 scarlett systemd-journal[200]: Runtime journal is using 8.0M (max allowed 297.9M, trying to leave 446.9M free of 2.9G available → current limit 297.9M). Nov 06 16:55:01 scarlett systemd-journal[200]: Runtime journal is using 8.0M (max allowed 297.9M, trying to leave 446.9M free of 2.9G available → current limit 297.9M). Nov 06 16:55:01 scarlett kernel: microcode: CPU0 microcode updated early to revision 0x19, date = 2013-06-21 Nov 06 16:55:01 scarlett kernel: Initializing cgroup subsys cpuset Nov 06 16:55:01 scarlett kernel: Initializing cgroup subsys cpu Nov 06 16:55:01 scarlett kernel: Initializing cgroup subsys cpuacct Nov 06 16:55:01 scarlett kernel: Linux version 4.2.5-300.fc23.x86_64 ([email protected]) (gcc version 5.1.1 20150618 (Red Hat 5.1.1-4) (GCC) ) #1 SMP Tue Oct 27 04:29:56 UTC 2015 Nov 06 16:55:01 scarlett kernel: Command line: BOOT_IMAGE=/vmlinuz-4.2.5-300.fc23.x86_64 root=/dev/mapper/fedora_scarlett-root ro rd.lvm.lv=fedora_scarlett/root rhgb quiet LANG=en_US.UTF-8 Nov 06 16:55:01 scarlett kernel: x86/fpu: Legacy x87 FPU detected. Nov 06 16:55:01 scarlett kernel: x86/fpu: Using 'lazy' FPU context switches. Nov 06 16:55:01 scarlett kernel: e820: BIOS-provided physical RAM map: Nov 06 16:55:01 scarlett kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable Nov 06 16:55:01 scarlett kernel: BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved Nov 06 16:55:01 scarlett kernel: BIOS-e820: [mem 0x00000000000e4000-0x00000000000fffff] reserved Nov 06 16:55:01 scarlett kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000bf75ffff] usable Nov 06 16:55:01 scarlett kernel: BIOS-e820: [mem 0x00000000bf760000-0x00000000bf76dfff] ACPI data Nov 06 16:55:01 scarlett kernel: BIOS-e820: [mem 0x00000000bf76e000-0x00000000bf7a7fff] ACPI NVS Nov 06 16:55:01 scarlett kernel: BIOS-e820: [mem 0x00000000bf7a8000-0x00000000bf7dffff] reserved Nov 06 16:55:01 scarlett kernel: BIOS-e820: [mem 0x00000000bf7eb800-0x00000000bfffffff] reserved
日记本默认使用寻呼机,因此您可以使用箭头键和 PgUp/PgDn 键四处移动。 试一试,注意一些行被突出显示。 例如,错误消息以红色显示。
由于日志是持久的,日志可以覆盖几个月的系统日志。 您可能不想翻阅所有这些输出。 如果您正在查找来自最近系统启动的数据,对于 example,您可以使用 -b 仅显示该信息:
journalctl -b
但对于许多人来说,这也是需要仔细研究的。 如果您正在对特定服务问题进行故障排除,则尤其如此。 假设您正在尝试找出问题 网络管理器. 您可以使用 -u 开关按 systemd 单元过滤日志:
journalctl -b -u NetworkManager
但是,如果您的系统已经运行了数周或数月怎么办? 这在 Linux 操作系统中并不少见 Fedora, 毕竟。 幸运的是,您还可以按时间过滤:
journalctl -b -u NetworkManager --since="yesterday"
更具体地说,您可以通过使用 -p 过滤优先级来发现错误。 这些优先级与旧的 syslog 系统中使用的相同,例如 err 表示错误,或者 warning 表示警告。
journalctl -b -u NetworkManager --since="yesterday" -p err
期刊元数据
但是,这本杂志的内容远不止表面上所见。 日志中的每个条目都包含大量元数据。
如果使用 -o 开关,则可以切换日志的输出格式。 默认情况下,日志使用模仿 syslog 的短格式。 但是,详细设置将为您显示每个日记条目的元数据:
$ journalctl -b -u NetworkManager --since="yesterday" -o verbose Sun 2015-11-08 00:25:43.491639 EST [s=fdcd66beb0fc4bb1b46acabbb548fd69;i=e264b;b=a8ff73d157c541abbfaca338ecddccba;m=7192b31e50;t=52400b547291a;x=4a57fe2915e9a6c3] _MACHINE_ID=e72f725410ac48dfb979ead85d8ff44f _HOSTNAME=localhost _SYSTEMD_SLICE=system.slice _TRANSPORT=syslog _UID=0 _GID=0 SYSLOG_FACILITY=3 PRIORITY=6 SYSLOG_IDENTIFIER=dhclient _COMM=dhclient _EXE=/usr/sbin/dhclient _CAP_EFFECTIVE=203402 _SYSTEMD_CGROUP=/system.slice/NetworkManager.service _SYSTEMD_UNIT=NetworkManager.service _SELINUX_CONTEXT=system_u:system_r:dhcpc_t:s0 _CMDLINE=/sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-wlp2s0.pid -lf /var/lib/NetworkManager/dhclient-d989668a-f8d3-4729-a2b0-d02b244e0161-wlp2s0.lease -cf / _BOOT_ID=a8ff73d157c541abbfaca338ecddccba SYSLOG_PID=2027 _PID=2027 MESSAGE=DHCPREQUEST on wlp2s0 to 192.168.1.254 port 67 (xid=0x6c674a2a) _SOURCE_REALTIME_TIMESTAMP=1446960343491639
使用字段
您也可以在这些字段中的任何一个上过滤期刊。 采取 example 有用的 _BOOT_ID 字段。 该字段让 systemd 识别日志条目所属的引导会话。 正如我们已经看到的,已经有一个 journalctl -b 选项可以只显示最近一次启动的日志条目。
但是系统重新启动之前的前几次呢? 您可以告诉日志向您显示所有记录的启动会话:
$ journalctl --list-boots -2 d30ee3a4f9ac4104aee3940d844e41fa Wed 2015-09-30 14:42:41 EDT—Wed 2015-09-30 14:58:03 EDT -1 1c677fd72e82413bb68fe95f10524aef Fri 2015-10-23 11:02:15 EDT—Mon 2015-11-02 08:55:44 EST 0 a8ff73d157c541abbfaca338ecddccba Mon 2015-11-02 08:55:51 EST—Sun 2015-11-08 21:01:01 EST
如您所见,最近的引导会话 ID 与上面的日志条目中的匹配(以 a8ff73d1… 开头)。 这是有道理的,因为我们要求日志仅显示自最近一次启动以来的条目。 但是现在我们可以专门从之前的引导会话中请求消息。
顺便说一句,您可以使用 Tab 键自动完成引导 ID,以避免键入错误。 不仅如此,您还可以自动完成字段名称,例如,输入 journalctl _B[Tab] 并且该字段完成。 然后你可以输入 1c[Tab] 使用我们的 example 上面,并且值完成:
journalctl _BOOT_ID=1c677fd72e82413bb68fe95f10524aef -u NetworkManager
另一个有用的字段是_COMM。 您可以使用它来过滤可能导致错误的特定可执行文件。 例如,NetworkManager 服务启动 dhclient 可执行文件以获取您的网络地址 Fedora 系统。 如果您的系统没有获得地址,您可能只想查看来自 dhclient 的日志消息:
journalctl _COMM=dhclient --since="2 hours ago"
如果您想知道任何字段的可用值,可以使用 -F 开关。 例如,请注意此命令如何向您显示与 –list-boots 类似的信息:
journalctl -F _BOOT_ID
例如,您可以使用此命令找出系统曾经运行过的所有 systemd 单元的名称:
journalctl -F _SYSTEMD_UNIT
日志变得简单
也许您对通过终端使用日志不感兴趣。 幸运的是,有一个名为 Logs 的有用应用程序,您可以获得 Fedora 工作站或其他版本。 通过软件应用程序安装它。 它为您提供了一个简单的点击界面,用于查看 systemd 日志消息。
您可能之前已经看过这个应用程序。 事实上,我们在 Fedora 杂志在这篇文章中为 Fedora 21. 你会很高兴知道它现在快如闪电,并且可以按需加载消息。
日志消息由生成消息的内容分隔。 要选择不同的类别,请在应用程序的左侧单击它。 您还可以选择特定的引导会话来检查日志。 单击日期和时间标题控件以选择您喜欢的会话。 您还可以使用搜索工具搜索特定问题。 最后,要显示任何日志消息的详细信息,请单击列表中的消息。
希望这篇文章向您展示了一些有用且有趣的方式来使用该期刊。 有关其他有用信息,请参阅 此博客条目 在最初的“systemd for administrators”系列中。 快乐记录!