# 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 规范的服务相对应的序号来显示指定数据
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 的对应,参考前面的章节
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
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: 让 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
# 可以看到这里已经传输到了
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
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
# 配置预设的目录后,服务重启后,会自动复制一份到该目录下
2
3
4
5
6
7
8
9
10
11
12
作者建议;有 rsyslog.service 以及 logrotate 的存在,所以这里产生的信息可以不用存档