Systemd是Linux系统的尖端系统和服务管理器:用于在系统启动时并行启动进程的init守护程序替换。 目前主流发行包括Fedora,Debian,Ubuntu,OpenSuSE,Arch,RHEL,CentOS等等。
早些时候,我们解释了“init”和“systemd”背后的故事 ; 在那里我们讨论了两个守护进程,为什么在技术上需要替换为' systemd '以及systemd的主要功能。
systemd与其他常用init系统的主要优点之一是支持集中管理系统和使用日志记录进程。 在本文中,我们将在Linux中学习如何使用journalctl命令在systemd下管理和查看日志消息。
重要提示 :在本指南中进一步介绍之前,您可能需要了解如何使用“Systemctl”命令来管理“Systemd”服务和单位 ,并且还可以在Linux中使用shell脚本在systemd中创建和运行新的服务单元 。 但是,如果你还好,请继续阅读。
在Systemd下配置日志收集日志消息
journald是从整个系统收集和写入日记帐分录的守护进程; 这些本质上是引导消息,来自内核和来自syslog或各种应用程序的消息,并将所有消息存储在中央位置 - 日志文件中。
您可以通过其编译时生成的默认配置文件/etc/systemd/journald.conf来控制journald的行为。 此文件包含可以更改其值的选项,以满足您的本地环境要求。
以下是使用cat命令查看的文件样式示例。
$ cat /etc/systemd/journald.conf
# See journald.conf(5) for details. [Journal] #Storage=auto #Compress=yes #Seal=yes #SplitMode=uid #SyncIntervalSec=5m #RateLimitInterval=30s #RateLimitBurst=1000 #SystemMaxUse= #SystemKeepFree= #SystemMaxFileSize= #SystemMaxFiles=100 #RuntimeMaxUse= #RuntimeKeepFree= #RuntimeMaxFileSize= #RuntimeMaxFiles=100 #MaxRetentionSec= #MaxFileSec=1month #ForwardToSyslog=yes #ForwardToKMsg=no #ForwardToConsole=no #ForwardToWall=yes #TTYPath=/dev/console #MaxLevelStore=debug #MaxLevelSyslog=debug #MaxLevelKMsg=notice #MaxLevelConsole=info #MaxLevelWall=emerg
请注意,可以在/run/systemd/journald.conf.d/*.conf中找到/usr/lib/systemd/*.conf.d/中的各种软件包安装和使用配置提取,并且运行时配置可能不一定使用。
启用磁盘上的日记数据存储
许多Linux发行版,包括Ubuntu及其衍生产品,如Linux Mint,默认情况下不会启用磁盘上的引导消息持久存储。
可以通过将“ 存储 ”选项设置为“ 持久 ”,使其能够启用,如下所示。 这将创建/ var / log / journal目录,并将所有日志文件存储在其下。
$ sudo vi /etc/systemd/journald.conf OR $ sudo nano /etc/systemd/journald.conf
[Journal] Storage=persistent
有关其他设置,请通过键入来查找应在“[Journal]”部分下配置的所有选项的含义。
$ man journald.conf
使用Timedatectl命令设置正确的系统时间
为了在使用日志服务的systemd下进行可靠的日志管理,请确保系统上包含时区的时间设置正确。
要查看系统上的当前日期和时间设置,请键入。
$ timedatectl OR $ timedatectl status Local time: Thu 2017-06-15 13:29:09 EAT Universal time: Thu 2017-06-15 10:29:09 UTC RTC time: Thu 2017-06-15 10:29:09 Time zone: Africa/Kampala (EAT, +0300) Network time on: yes NTP synchronized: yes RTC in local TZ: no
要设置正确的时区和可能的系统时间,请使用以下命令。
$ sudo timedatectl set-timezone Africa/Kampala $ sudo timedatectl set-time “13:50:00”
使用Journalctl命令查看日志消息
journalctl是用于查看systemd日志(由日志服务编写的)的内容的实用程序。
要显示所有收集的日志,不进行任何过滤,请键入。
$ journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT Jun 14 21:56:43 youcl systemd-journald[336]: Runtime journal (/run/log/journal Jun 14 21:56:43 youcl kernel: Initializing cgroup subsys cpuset Jun 14 21:56:43 youcl kernel: Initializing cgroup subsys cpu Jun 14 21:56:43 youcl kernel: Initializing cgroup subsys cpuacct Jun 14 21:56:43 youcl kernel: Linux version 4.4.0-21-generic ([email protected]) Jun 14 21:56:43 youcl kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21- Jun 14 21:56:43 youcl kernel: KERNEL supported cpus: Jun 14 21:56:43 youcl kernel: Intel GenuineIntel Jun 14 21:56:43 youcl kernel: AMD AuthenticAMD Jun 14 21:56:43 youcl kernel: Centaur CentaurHauls Jun 14 21:56:43 youcl kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2] Jun 14 21:56:43 youcl kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo Jun 14 21:56:43 youcl kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg Jun 14 21:56:43 youcl kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg Jun 14 21:56:43 youcl kernel: x86/fpu: Enabled xstate features 0x7, context si Jun 14 21:56:43 youcl kernel: x86/fpu: Using 'eager' FPU context switches. Jun 14 21:56:43 youcl kernel: e820: BIOS-provided physical RAM map: Jun 14 21:56:43 youcl kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000 Jun 14 21:56:43 youcl kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000 Jun 14 21:56:43 youcl kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff Jun 14 21:56:43 youcl kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201 Jun 14 21:56:43 youcl kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400
查看基于引导的日志消息
您可以使用--list-boots
选项显示引导号(相对于当前引导)的列表,它们的ID和与引导相对应的第一个和最后一个消息的时间戳。
$ journalctl --list-boots -1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1 0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1
要从当前启动(数字0)查看日记帐分录,请使用这样的-b
开关(与上面的示例输出相同)。
$ journalctl -b
并从以前的引导中查看日志,使用-b
选项的-1
相对指针如下。
$ journalctl -b -1
或者,使用这样的引导ID。
$ journalctl -b 9fb590b48e1242f58c2579defdbbddc9
基于时间过滤日志消息
要以协调世界时(UTC)格式使用时间,请按如下所示添加--utc
选项。
$ journalctl --utc
要查看自特定日期和时间(例如,2017年6月15日上午8:15)以来的所有条目,请键入此命令。
$ journalctl --since "2017-06-15 08:15:00" $ journalctl --since today $ journalctl --since yesterday
查看最近的日志消息
要查看最近的日志消息(默认为10),请使用-n
标志,如下所示。
$ journalctl -n $ journalctl -n 20
查看内核生成的日志消息
要只查看内核消息,类似于dmesg命令输出,可以使用-k
标志。
$ journalctl -k $ journalctl -k -b $ journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9
查看按单位生成的日志消息
要查看特定单位的所有日记帐分录,请按照以下步骤使用-u
开关。
$ journalctl -u apache2.service
要归零到当前启动,请键入此命令。
$ journalctl -b -u apache2.service
要显示之前启动的日志,请使用此选项。
$ journalctl -b -1 -u apache2.service
以下是一些其他有用的命令:
$ journalctl -u apache2.service $ journalctl -u apache2.service --since today $ journalctl -u apache2.service -u nagios.service --since yesterday
查看进程生成的日志消息
要查看特定进程生成的日志,请将其指定为PID。
$ journalctl _PID=19487 $ journalctl _PID=19487 --since today $ journalctl _PID=19487 --since yesterday
查看用户或组ID生成的日志消息
要查看特定用户或组生成的日志,请指定此用户或组ID。
$ journalctl _UID=1000 $ journalctl _UID=1000 --since today $ journalctl _UID=1000 -b -1 --since today
查看文件生成的日志
要显示文件(可能是可执行文件)生成的所有日志,例如D-Bus可执行文件或bash可执行文件,只需键入。
$ journalctl /usr/bin/dbus-daemon $ journalctl /usr/bin/bash
按优先级查看日志消息
您还可以使用-p
标志基于消息优先级或优先级范围过滤输出。 可能的值是:0 - 出现,1 - 警报,2 - 暴击,3 - 错误,4 - 警告,5 - 通知,6 - 信息,7 - 调试)
$ journalctl -p err
要指定范围,请使用以下格式(出现警告)。
$ journalctl -p 1..4 OR $ journalctl -p emerg..warning
实时查看日志消息
在使用-f
选项(类似于tail -f功能)编写时,您可以几乎观察日志。
$ journalctl -f
处理日志显示格式
如果要控制日记帐分录的输出格式,请添加-o
标志并使用以下选项:cat,export,json,json-pretty,json-sse,short,short-iso,short-monotonic,short-precise和详细(检查手册页中的选项的含义:
cat选项显示没有任何元数据(时间戳等)的每个日记帐分录的实际消息。
$ journalctl -b -u apache2.service -o cat
管理系统上的期刊
要检查日志文件的内部一致性,请使用--verify
选项。 如果一切正常,输出应该指示一个PASS。
$ journalctl --verify PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal 491f68: Unused data (entry_offset==0) PASS: [email protected][email protected]l PASS: [email protected][email protected]l PASS: [email protected][email protected]l PASS: [email protected][email protected]l
删除旧的日记文件
您还可以使用--disk-usage
选项显示所有日志文件的当前磁盘使用--disk-usage
。 它显示所有归档和活动日志文件的磁盘使用量的总和:
$ journalctl --disk-usage
要删除旧的(已归档)日志文件,请运行以下命令:
$ sudo journalctl --vacuum-size=50M #delete files until the disk space they use falls below the specified size $ sudo journalctl --vacuum-time=1years #delete files so that all journal files contain no data older than the specified timespan $ sudo journalctl --vacuum-files=4 #delete files so that no more than the specified number of separate journal files remain in storage location
旋转日志文件
最后但并非最不重要的是,您可以使用--rotate
选项指示journald旋转日志文件。 请注意,在旋转操作完成之前,该指令不会返回:
$ sudo journalctl --rotate
有关深入使用指南和选项,请查看journalctl手册页,如下所示。
$ man journalctl
请检查一些有用的文章。
- 管理系统启动过程和服务(SysVinit,Systemd和Upstart)
- Petiti - 用于Linux SysAdmins的开源日志分析工具
- 如何在Linux中使用Logrotate设置和管理日志轮换
- lnav - 从Linux终端观察和分析Apache日志
就是这样。 使用下面的反馈来询问任何问题或添加您关于此主题的想法。