logrotate即日志轮转,是定期对日志进行切片,压缩等处理的工具;
它是由每天的定时任务自动触发的,读取的是/etc/logrotate.d下的文件; 然后根据里面的配置再决定对各个日志文件如何处理;
由于是定时任务自动触发,所以这些配置文件只需要放进去就好,不需要重启logroate; 以下是执行的路径:
/usr/sbin/crond → /etc/cron.d/0hourly → /etc/cron.hourly/0anacron → /usr/sbin/anacron → /etc/anacrontab ->/etc/cron.daily/logrotate → /etc/logroate.d/libvirtd+libvird.qemu
libvirt lograte涉及到二个配置文件:
/etc/logrotate.d/libvirtd # libvirtd本身的日志文件
/etc/logrotate.d/libvirtd.qemu # 虚拟机的qemu日志文件
默认配置:
libvirtd:
/var/log/libvirt/libvirtd.log {
weekly # 每周轮转一次,还要结合下面的minisize,即同时满足minisize指定的大小才会进行切片操作;另外还有size, maxsize参数,可以参考后面的说明;
missingok # 如果文件不存在,忽略
rotate 4 # 轮转4次,即最终会保留5个文件:libvirtd.log、libvirtd.log.1、libvirtd.log.2.gz、libvirtd.log.3.gz、libvirtd.log.4.gz
compress # 轮转后的文件进行压缩
delaycompress # 延迟压缩,就是上面的libvirtd.log.1; 如果再转轮一次,这个libvirtd.log.1就会变成libvirtd.log2.gz
copytruncate # 切片日志的创建方式; copytruncate可以理解为: cp libvirtd.log libvirt.log.1; echo > libvirtd.log; 这样就清空了日志文件内容同时不改变原文件的句柄,因为有些程序不支持运行时重新打开日志文件;
#另外一种方式是create,可以理解为:mv libvirtd.log libvirtd.log.1; touch libvirtd.log; 然后lograte通知程序重新打开新的libvirtd.log文件
minsize 100k # 文件最小达到100k时才切片
}
libvirtd.qemu:
/var/log/libvirt/qemu/*.log {
# The QEMU driver is configured to use virtlogd by
# default, which will perform log rollover.
# This logrotate config is still installed for cases
# where the user has switched off virtlogd.
#
# If virtlogd is active, ensure that size here is
# larger than 'max_size' in the virtlogd config
# so that logrotate becomes a no-op
size 2097153 # 这儿日志只要达到2M+1个字节就切片;
missingok
rotate 4
compress
delaycompress
copytruncate
}
对上述注释一点说明:
libvirt默认有一个virtlogd日志服务程序,是用来记录虚拟机控制台输出的; 它和libvirtd是分开的,目的是重启libvirtd时不用丢失虚拟机的日志;
需要在xml中配置:
<serial type='pty'>
<log file='/var/log/dpc-test-console.log' append='on'/>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
</serial>
同时虚拟机中打开控制台输出:console=tty0 console=ttyS0
这样虚拟机控制台日志会输出到/var/log/dpc-test-console.log中; 这个日志由/etc/libvirt/virtlog.conf控制切片:默认是2M,最多保留三个备份;
注:这个配置会同时对虚拟机控制台日志(/var/log/dpc-test-console.log)和虚拟机qemu日志(/var/log/libvirt/qemu/dpc-test.log)生效,即使它们不是在同一个目录;所以只要virtlogd.conf中设置的max_size比libvirtd.qemu中的size小,这个切片就会由virtlogd完成了,也就是注释中的:If virtlogd is active, ensure that size here is larger than 'max_size' in the virtlogd config so that logrotate becomes a no-op;
logrotate其他一些参数说明:
- size
触发分割的条件是:1.日志大小达到这个值,和时间周期没有关系。 - minisize
触发分割的条件是:1.时间周期到了,2.日志大小达到这个值;两个条件都要满足。 - maxsize
触发分割的条件是:1.时间周期到了,2. 日志大小大于这个值;两个条件任何一个满足。
另外还有个参数 :dateext,生成的切片文件会是时间结尾的,比如:libvirtd.log-20210207.gz