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

现在有了 systemd 之后,由于这玩意儿是核心唤醒的,然后又是第一支执行的软件,它可以主动呼 叫 systemd-journald 来协助记载登录文件~ 因此在开机过程中的所有信息,包括启动服务与服务若 启动失败的情况等等,都可以直接被记录到 systemd-journald 里头去!

不过 systemd-journald 由于是使用于内存的登录文件记录方式,因此重新启动过后,开机前的登录文 件信息当然就不会被记载了。

为此,我们还是建议启动 rsyslogd 来协助分类记录!也就是说, systemd-journald 用来管理与查询这次开机后的登录信息,而 rsyslogd 可以用来记录以前及现在的所

以数据到磁盘文件中,

使用 journalctl 观察登录信息

那么 systemd-journald.service 的数据要如何叫出来查阅呢?很简单!就透过 journalctl 即可!

[root@study ~]# journalctl [-nrpf] [--since TIME] [--until TIME] _optional
选项与参数:
预设会秀出全部的 log 内容,从旧的输出到最新的讯息
-n :秀出最近的几行的意思~找最新的信息相当有用
-r :反向输出,从最新的输出到最旧的数据
-p :秀出后面所接的讯息重要性排序!请参考前一小节的 rsyslogd 信息
-f :类似 tail -f 的功能,持续显示 journal 日志的内容(实时监测时相当有帮助!)
--since --until:设定开始与结束的时间,让在该期间的数据输出而已
_SYSTEMD_UNIT=unit.service :只输出 unit.service 的信息而已
_COMM=bash :只输出与 bash 有关的信息
_PID=pid :只输出 PID 号码的信息
_UID=uid :只输出 UID 为 uid 的信息
SYSLOG_FACILITY=[0-23] :使用 syslog.h 规范的服务相对序号来呼叫出正确的数据! 范例一:秀出目前系统中所有的 journal 日志数据
[root@study ~]# journalctl
-- Logs begin at Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 00:01:01 CST. --
Aug 17 18:37:52 study.centos.vbird systemd-journal[105]: Runtime journal is using 8.0M (max
142.4M, leaving 213.6M of free 1.3G, current limit 142.4M).
Aug 17 18:37:52 study.centos.vbird systemd-journal[105]: Runtime journal is using 8.0M (max
142.4M, leaving 213.6M of free 1.3G, current limit 142.4M).
Aug 17 18:37:52 study.centos.vbird kernel: Initializing cgroup subsys cpuset
Aug 17 18:37:52 study.centos.vbird kernel: Initializing cgroup subsys cpu
.....(中間省略).....
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19268]: finished 0anacron
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19270]: starting 0yum-hourly.cron
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19274]: finished 0yum-hourly.cron
# 从这次开机以来的所有数据都会显示出来!透过 less 一页页翻动给管理员查阅!资料量相当大! 范例二:(1)仅显示出 2015/08/18 整天以及(2)仅今天及(3)仅昨天的日志数据内容
[root@study ~]# journalctl --since "2015-08-18 00:00:00" --until "2015-08-19 00:00:00"
[root@study ~]# journalctl --since today
[root@study ~]# journalctl --since yesterday --until today 范例三:只找出 crond.service 的数据,同时只列出最新的 10 笔即可
[root@study ~]# journalctl _SYSTEMD_UNIT=crond.service -n 10 范例四:找出 su, login 执行的登录档,同时只列出最新的 10 笔即可
[root@study ~]# journalctl _COMM=su _COMM=login -n 10 范例五:找出讯息严重等级为错误 (error) 的讯息!
[root@study ~]# journalctl -p err 范例六:找出跟登录服务 (auth, authpriv) 有关的登录文件讯息
[root@study ~]# journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10

有 journalctl 就真的可以搞定你的讯息数据啰!全部的资料都在这里面耶~再来假设一下, 你想要了解到登录档的实时变化, 那又该如何处置呢?现在,请开两个终端机,让我们来处理处理!

# 第一号终端机,请使用底下的方式持续侦测系统!
[root@study ~]# journalctl -f
# 这时系统会好像卡住~其实不是卡住啦!是类似 tail -f 在持续的显示登录文件信息的! # 第二号终端机,使用底下的方式随便发一封 email 给系统上的账号!
[root@study ~]# echo "testing" | mail -s 'tset' dmtsai
# 这时,你会发现到第一号终端机竟然一直输出一些讯息吧!没错!这就对了!

logger 指令的应用

上面谈到的是叫出登录档给我们查阅,那换个角度想,『如果你想要让你的数据储存到登录文件当中』 呢?那该如何是好? 好用的家伙了!这个家伙可以传输很多信息,不过, 我们只使用最简单的本机信息传递~

[root@study ~]# logger [-p 服务名称.等级] "讯息"
选项与参数:
服务名称.等级 范例一:指定一下,让 dmtsai 使用 logger 来传送数据到登录文件内
[root@study ~]# logger -p user.info "I will check logger command"
[root@study ~]# journalctl SYSLOG_FACILITY=1 -n 3
-- Logs begin at Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 18:03:17 CST. --
Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29710]: starting 0yum-hourly.cron
Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29714]: finished 0yum-hourly.cron
Aug 19 18:03:17 study.centos.vbird dmtsai[29753]: I will check logger command

现在,让我们来瞧一瞧,如果我们之钱写的 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
Aug 19 18:09:37 study.centos.vbird dmtsai[29850]: backup.sh is starting
Aug 19 18:09:54 study.centos.vbird dmtsai[29855]: backup.sh is finished

保存 journal 的方式

systemd-journald.servicd 的讯息是不会放到下一次开机后的,所以,重新启动后, 那之前的记录通通会遗失。虽然我们大概都有启动 rsyslogd 这个服务来进行后续的登录档放置,不 过如果你比较喜欢 journalctl 的存取方式,那么可以将这些数据储存下来喔!

systemd-journald.service 的配置文件主要参考 /etc/systemd/journald.conf 的内容,因为预设的情况底下,配置文件的内容应该已经符合我 们的需求,所以这边就不再修改配置文件了。只是如果想要保存你的 journalctl 所读取的登录档, 那么就得要建立一个 /var/log/journal 的目录,并且处理一下该目录的权限,那么未来重新启动 systemd-journald.service 之后, 日志登录文件就会主动的复制一份到 /var/log/journal 目录下.

# 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/
drwxr-sr-x. 2 root systemd-journal 27 Aug 20 02:37 309eb890d09f440681f596543d95ec7a
05-27 12:29