# systemd-journald.service 简介

以前只有 rsyslogd 的时候,由于 rsyslogd 必须要开机完成且执行了 rsyslogd daemon 后,日志文件才会开始记录。所以,核心还需要自己产生一个 klogd 的服务,才能将系统在开机过程、启动服务的过程中的信息记录下来,然后等 rsyslogd 启动后传送给它处理

有了 systemd 后,由于它是核心唤醒的,又是第一个执行的软件,它可以主动调用 systemd-journald 来协助记录日志文件,因此在开机过程中的所有信息,包括启动服务于服务若启动失败的情况等,都可以直接被记录到 systemd-journald s里

systemd-journald 记录到内存中,再给 rsyslogd 记录到硬盘中

TIP

linux 的内存在文件系统中也有对应的文件形态在 /run/log/ 下,只是人眼看不懂就是了,重启后,该数据就没有了

# 使用 journalctl 观察日志信息

journalct [-nrpf] [--since TIME] [--until TIME] _optional

选项与参数:
	预设会显示全部的 log 内容,从旧的输出到最新的信息
	-n:显示最近 n 行的信息,找最新信息时有用
	-r:反向输出,从最新的输出到最旧的输出
	-p:显示后面接的信息重要性排序,前一章讲解的日志级别
	-f:类似 tail -f 功能,持续显示 journal 日志内容
	--since --unitl:设置开始与结束时间,只显示某段时间范围内的数据
	_SYSTEMD_UNIT=unit.service:只输出某个服务的信息
	_COMM=bash:只输出与 bash 有关的信息
	_PID=pid:只输出某个 PID 的信息
	_UID=uid:只输出某个 uid 的信息
	SYSLOG_FACILITY=[0-23]:使用 syslog.h 规范的服务相对应的序号来显示指定数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 范例 1: 显示目前系统中所有的  journal 日志数据
[root@study ~]# journalctl 
-- Logs begin at Sun 2020-03-15 20:13:33 CST, end at Mon 2020-03-16 00:50:01 CST. --
Mar 15 20:13:33 study.centos.mrcode systemd-journal[90]: Runtime journal is using 7.2M (max allowed 58.1M, trying to leave 87.
Mar 15 20:13:33 study.centos.mrcode kernel: Initializing cgroup subsys cpuset
Mar 15 20:13:33 study.centos.mrcode kernel: Initializing cgroup subsys cpu
Mar 15 20:13:33 study.centos.mrcode kernel: Initializing cgroup subsys cpuacct
Mar 15 20:13:33 study.centos.mrcode kernel: Linux version 3.10.0-1062.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc ver
Mar 15 20:13:33 study.centos.mrcode kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1062.el7.x86_64 root=/dev/mapper/centos-r
Mar 15 20:13:33 study.centos.mrcode kernel: e820: BIOS-provided physical RAM map:
# 从当次开机以来的所有数据都会显示出来,通过 less 一页页显示,数据流很大

# 范例 2:仅显示 2020/03/22 整天、昨天 的数据
[root@study ~]# journalctl --since "2020-03-16 00:00:00" --until "2020-03-16 23:59:59"
[root@study ~]# journalctl --since today		# 今天
[root@study ~]# journalctl --since yesterday --unitl today		# 昨天到今天

# 范例 3:只招数 crond.service 的数据, 同时只列出最新的 10 行信息
[root@study ~]# journalctl _SYSTEMD_UNIT=crond.service -n 10

# 范例 4:找出 su、login 执行的的日志,同时只列出最新的 10 行数据
[root@study ~]# journalctl _COMM=su _COMM=login -n 10

# 范例 5:找出信息严重等级为 error 的信息
[root@study ~]# journalctl -p err

# 范例 6:找出与登录服务 auth、authpriv 有关的日志文件信息
[root@study ~]# journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10
# 关于  SYSLOG_FACILITY 的对应,参考前面的章节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

使用它的 -f 实时显示功能

# 第一个终端机
[root@study ~]# journalctl -f
... 下面的信息是,2 号终端机执行指令后显示的信息
Mar 16 01:15:25 study.centos.mrcode postfix/pickup[14953]: 827B31075: uid=1000 from=<mrcode>
Mar 16 01:15:25 study.centos.mrcode postfix/cleanup[20434]: 827B31075: message-id=<20200315171525.827B31075@study.centos.mrcode>
Mar 16 01:15:25 study.centos.mrcode postfix/qmgr[1618]: 827B31075: from=<mrcode@study.centos.mrcode>, size=449, nrcpt=1 (queue active)
Mar 16 01:15:25 study.centos.mrcode postfix/local[20436]: 827B31075: to=<dmtsai@study.centos.mrcode>, orig_to=<dmtsai>, relay=local, delay=0.02, delays=0.02/0/0/0, dsn=5.1.1, status=bounced (unknown user: "dmtsai")
Mar 16 01:15:25 study.centos.mrcode postfix/cleanup[20434]: 87ED81076: message-id=<20200315171525.87ED81076@study.centos.mrcode>
Mar 16 01:15:25 study.centos.mrcode postfix/bounce[20437]: 827B31075: sender non-delivery notification: 87ED81076
Mar 16 01:15:25 study.centos.mrcode postfix/qmgr[1618]: 827B31075: removed
Mar 16 01:15:25 study.centos.mrcode postfix/qmgr[1618]: 87ED81076: from=<>, size=2291, nrcpt=1 (queue active)
Mar 16 01:15:25 study.centos.mrcode postfix/local[20436]: 87ED81076: to=<mrcode@study.centos.mrcode>, relay=local, delay=0.01, delays=0/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Mar 16 01:15:25 study.centos.mrcode postfix/qmgr[1618]: 87ED81076: removed


# 第二个终端机
[mrcode@study ~]$ echo "test" | mail -s 'test' dmtsai

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# logger 指令的应用

journalctl 指令是查阅信息,可以通过 logger 把你的数据存储到文件中,下面介绍最简单的本机信息传递,更多的方法请自行查阅 man logger

logger [-p 服务名称.等级] "信息"
1
# 范例 1: 让 dmtsai 使用 logger 来传送数据到日志文件
[root@study ~]$ logger -p user.info "I will check logger command"
[root@study ~]# journalctl SYSLOG_FACILITY=1 -n 3
-- Logs begin at Sun 2020-03-15 20:13:33 CST, end at Mon 2020-03-16 01:20:43 CST. --
Mar 15 20:13:50 study.centos.mrcode spice-vdagent[1860]: Cannot access vdagent virtio channel /dev/virtio-ports/com.redhat.spi
Mar 15 20:13:50 study.centos.mrcode spice-streaming-agent[1867]: Failed to open the streaming device "/dev/virtio-ports/org.sp
Mar 16 01:20:43 study.centos.mrcode mrcode[13699]: I will check logger command
# 可以看到这里已经传输到了
1
2
3
4
5
6
7
8

之前写的 backup.service 服务中,如果使用手动方式来备份,即手动执行 /backups/backup.sh log 来备份时,通过 logger 记录备份开始时间和结束时间

[root@study ~]# vim /backups/backup.sh
#!/bin/bash

if [ "${1}" == 'log' ]; then
	logger -p syslog.info "backup.sh is starting"
fi

source="/etc /home /root /var/lib /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"

[ ! -d /backups ] && mkdir /backups

tar -zcvf ${target} ${source} $> /backups/backup.log

if [ "${1}" == 'log' ]; then
	logger -p syslog.info "backup.sh is finished"
fi

[root@study ~]# /backups/backup.sh log
[root@study ~]# journalctl SYSLOG_FACILITY=5 -n 3
-- Logs begin at Sun 2020-03-15 20:13:33 CST, end at Mon 2020-03-16 01:28:54 CST. --
Mar 16 00:42:45 study.centos.mrcode rsyslogd[7107]:  [origin software="rsyslogd" swVersion="8.24.0-38.el7" x-pid="7107" x-info
Mar 16 01:28:27 study.centos.mrcode mrcode[17659]: backup.sh is starting
Mar 16 01:28:54 study.centos.mrcode mrcode[19555]: backup.sh is finished

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

也就是说,该指令是类似一个日志服务接口,我们可以通过它把日志信息记录下来

# 保存 journal 的方式

systemd-journald.service 的信息在内存中,而持久化到硬盘的数据是通过 rsyslogd 来做的,如果你想要保存下 journald 处理的数据,可以通过如下的方式

基本上 systemd-journald.service 的配置文件主要参考 /etc/systemd/journald.conf 的内容,默认配置基本上满足需求,如有定制信息,请通过 man 5 journald.conf 查阅

# 1. 处理所需要的目录与相关权限设置
[root@study ~]# mkdir /var/log/journal
[root@study ~]# chown root:systemd-journal /var/log/journal/
[root@study ~]# chmod 2775 /var/log/journal/

# 2. 重新启动 systemd-journald 并观察备份的日志数据
[root@study ~]# systemctl restart systemd-journald.service 
[root@study ~]# ll /var/log/journal/
total 0
drwxr-sr-x. 2 root systemd-journal 28 Mar 16 01:35 f228ab37c368416c84c6b27971ba45a9

# 配置预设的目录后,服务重启后,会自动复制一份到该目录下
1
2
3
4
5
6
7
8
9
10
11
12

作者建议;有 rsyslog.service 以及 logrotate 的存在,所以这里产生的信息可以不用存档