linux logrotate 服务

环境信息

  • Centos 7

logrotate 程序是一个日志文件管理工具。用于分割日志文件,压缩转存、删除旧的日志文件,并创建新的日志文件

logrotate 是基于 crond 来运行的,其脚本是 /etc/cron.daily/logrotate,日志轮转是系统自动完成的。
实际运行时,logrotate 会调用配置文件 /etc/logrotate.conf
/etc/cron.daily/logrotate 文件内容如下:

/etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

可以执行以下命令手动执行日志切割:

logrotate -f /etc/logrotate.conf

以下命令可以检测配置文件是否正确:

logrotate -d /etc/logrotate.conf

配置说明

logrotate 的主配置文件默认为 /etc/logrotate.conf,默认配置如下:

/etc/logrotate.conf
# 默认每一周执行一次 rotate 轮转工作
weekly

# 保留多少个日志文件(轮转几次).默认保留四个.0 指没有备份
rotate 4

# 自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;
create

# 这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,
# 如果注释掉,切割出来是按数字递增,即 xxx.log-1这种格式
dateext

# 包含 /etc/logrotate.d 下的其他配置文件 ,用于隔离出各个服务的配置
include /etc/logrotate.d

# 是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉就行
# compress
# nocompress

# 针对指定的文件做轮转切割
/var/log/wtmp {
# 每月轮转一次,取代全局默认值
monthly

# 创建新文件,并指定权限,用户和组
create 0664 root utmp

# 文件大小超过 1m 后才进行切割,到了 1 个月,文件大小小于 1m,不会进行切割
minsize 1M

rotate 1
}
/var/log/btmp {
# 如果日志丢失,不报错继续滚动下一个日志
missingok

monthly
create 0600 root utmp
rotate 1
}

其他常用选项说明如下:

/etc/logrotate.conf
# 指定转储周期为每天
daily

# 即使日志文件为空文件也做轮转,这个是 logrotate 的缺省选项。
ifempty

# 当日志文件为空时,不进行轮转
notifempty

# 当日志文件大于指定大小后就轮转,支持的单位: k,K,m,M
size 5M

# 用于还在打开中的日志文件,把当前日志备份并截断;
# 是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
copytruncate

# 运行 postrotate 脚本,作用是在所有日志都轮转后统一执行一次脚本。
# 如果没有配置这个,那么每个日志轮转后都会执行一次脚本
sharedscripts

# 在 logrotate 转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
postrotate


# 在 logrotate 转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
prerotate

# 将轮转的日志保存到指定路径下,默认保存在日志文件同一目录下
olddir /data/logs/

# 如果产生日志的进程的运行用户不是 root,需要指定相关的用户和组,否则会报错:because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation. ,如果只配置了用户,未配置组,会报错:error: error switching euid to 1003 and egid to -1: Invalid argument
su appuser appgroup

配置示例

nginx 日志切割配置文件示例,创建 /etc/logrotate.d/nginx:

/etc/logrotate.d/nginx
/logs/nginx/access/*.log
/logs/bginx/error/*.log {
daily
compress
rotate 7
missingok
notifempty
dateext
sharedscripts
postrotate
if [ -f /run/nginx.pid ]; then
kill -USR1 `cat /run/nginx.pid`
fi
endscript
}

使用 copytruncate 方式切割 nginx 日志,此种方式不需要重启 nginx 服务[1]

/etc/logrotate.d/nginx
/logs/nginx/access/*.log
/logs/bginx/error/*.log {
copytruncate
daily
compress
rotate 7
missingok
notifempty
dateext

}

参考链接

logrotate 原理介绍和配置详解

脚注