centos7的日志系统:journald, rsyslog, logrotate
by 伊布
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
Subscribe via RSS