2团
Published on 2023-04-26 / 10 Visits
0
0

基于logrotate的Openresty日志切割

1. logrotate配置

cd /etc/logrotate.d/
touch nginx

在/etc/logrotate.d/文件夹下创建nginx文件,输入以下内容:

/usr/local/openresty/nginx/logs/*.log {
	rotate 4
	daily
	missingok
	notifempty
	compress
	delaycompress
	sharedscripts
	postrotate
	if [ -f /usr/local/openresty/nginx/logs/nginx.pid ]; then
		kill -USR1 `cat /usr/local/openresty/nginx/logs/nginx.pid`
	fi
	endscript
}

输入完成后,可直接调用/usr/sbin/logrotate -f /etc/logrotate.d/nginx 执行日志切割,具体结果详见Openresty日志文件夹下文件。

重启systemctl restart logrotate.service 即完成相应配置。

2. logrotate参数说明

# 配置		   # 说明
daily			# 指定转储周期为每天
weekly			# 指定转储周期为每周
monthly			# 指定转储周期为每月
rotate count	# 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
compress		# 通过gzip 压缩转储以后的日志
nocompress		# 不做gzip压缩处理
create mode owner group	# 轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate		# 不建立新的日志文件
delaycompress	# 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress	# 覆盖 delaycompress 选项,转储同时压缩
missingok		# 如果日志丢失,不报错继续滚动下一个日志
ifempty			# 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项
notifempty		# 当日志文件为空时,不进行轮转
mail address	# 把转储的日志文件发送到指定的E-mail 地址
olddir directory # 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir		# 转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts	# 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate		# 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate		# 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
dateext			# 使用当期日期作为命名格式
dateformat .%s	# 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
size(minsize) log-size	# 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem),例如 size 100M

3. logrotate.service设置

需要注意,如果不对logratate.service进行配置,会出现以下错误:

logrotate-service-failed.png

需要对以下文件进行如下修改:

vim /lib/systemd/system/logrotate.service
# 在文件的末尾插入如下内容即可
ReadWritePaths=/usr/local/openresty/nginx/logs

改动原因如下所示(详见说明文档):

lograte-service-field-detail.png

4. 参考文档

logrotate-succeeds-when-manually-run-as-root-but-fails-with-read-only-file-sys


Comment