1 日志系统

centos7使用systemd-journald做日志中心库,使用rsyslog来持久化日志,使用logrotate来轮转日志文件。

2 systemd-journald

systemd-journald 守护进程提供一种改进的日志管理服务,可以收集来自内核,启动过程的早期阶段,标准输出,系统日志,以及守护进程启动和运行期间的错误的消息。它将这些消息写到一个结构化的事件日志中,默认情况下不在重新启动之间保留。

2.1 journalctl查看日志

  • journalctl –dmesg 查看 dmesg 信息。
  • journalctl -f follow形式查看日志
  • journalctl –since=yesterday 指定时间段
  • journalctl -u kubelet 指定UNIT,即使用journald的组件。
  • journalctl –verify 检查日志文件的一致性

例如,docker daemon会配置为将所有容器的日志为存储到journald。

/usr/bin/docker-current daemon --exec-opt native.cgroupdriver=systemd --selinux-enabled --log-driver=journald

所以,运行中docker的日志,例如k8s的apiserver,都会打到journald里去。一条典型的journald日志

Aug 27 00:52:33 m1.adb.g1.com docker-current[963]: I0826 16:52:33.640689       1 panics.go:76] GET /healthz: (31.36µs) 200 [[Go-http-client/1.1] 127.0.0.1:21721]

注意下两个时间,前一个是journald打印的,后一个是具体容器打印的。

2.2 journald存储

centos7上journald的日志存储在/run/log中,所以journal的日志是存储于内存中的(/run是tmpfs),重启之后清空。默认journald占用空间上限4G,可以通过systemctl status systemd-journald查看。

3 journald日志固化:rsyslog

默认journald配置#ForwardToSyslog=no,所以并未将日志转发给syslog。syslog自己去读取的journald的日志文件(类似journalctl)。

# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark  # provides --MARK-- message capability

4 rsyslog文件轮转:logrotate

rsyslog的日志存储于/var/log下,显然日志文件不能无限变大,否则磁盘空间会被耗尽。centos7使用logrotate来做日志文件轮转。

$cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

logrotate的配置文件是/etc/logrotate.conf ,其定义了logrotate的玩法:每周,最多4周,文件名加时间后缀,默认不压缩

cat /etc/logrotate.conf 
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

/etc/logrotate.d/中定义了需要轮转的文件,syslog也在其中。

cat /etc/logrotate.d/syslog 
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler

5 centos7.2的bug

有时会在cento7.2的dmesg里发现如下日志,此时可能journald已经停止记录日志了。

[92658.758413] systemd-journald[17718]: Failed to write entry (21 items, 547 bytes), ignoring: Cannot assign requested address

可以通过verify找到冲突的文件后,删除该文件得到解决。

journalctl --verify
File corruption detected at /run/log/journal/024eed52f512473bb1bfbca2d3faedc3/system.journal:000000 (of 83886080 bytes, 0%).      

为了避免日后出现问题,可以设置Compress=no来规避。

echo "Compress=no" >> /etc/systemd/journald.conf
systemctl restart systemd-journald
systemctl restart rsyslog.service