在Systemd下管理日志消息使用Journalctl [综合指南]

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

请检查一些有用的文章。

  1. 管理系统启动过程和服务(SysVinit,Systemd和Upstart)
  2. Petiti - 用于Linux SysAdmins的开源日志分析工具
  3. 如何在Linux中使用Logrotate设置和管理日志轮换
  4. lnav - 从Linux终端观察和分析Apache日志

就是这样。 使用下面的反馈来询问任何问题或添加您关于此主题的想法。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏