工作中由于Nginx日志过于庞大不方便查阅。于是在网上看了一些相关资料都是五花八门一大堆坑,今天有时间来整理一下。
Logrotate 是 CentOS 操作系统内置日志管理工具,该工具可对系统中生成的大量日志文件进行归档管理,其允许对日志文件实行压缩、删除或邮寄等操作。Logrotate 可以按照每天、周、月或达到某一大小的日志文件进行归档操作,Logrotate 基于 anacrontab 实现计划任务,只需在 /etc/logrotate.d 目录下编写相关日志管理配置文件,就可以无须人工干预使用自动化方式完成日志归档操作。
指令:
yum -y install logrotate
一般CentOS 系统默认自带的,请无视这一步。
示例如下:
/etc/logrotate.conf # logrotate主配置文件
/usr/sbin/logrotate # logrotate二进制文件
/etc/logrotate.d/ # 自定义logrotate配置文件
/var/lib/logrotate/logrotate.status # logrotate管理日志执行记录的状态文件
我们这里使用第三项自定义配置。
代码如下(示例):
-?, --help #在线帮助
-d, --debug # 测试归档配置文件
-f, --force # 立即执行归档操作
-m, --mail=command # 指定发送邮件的命令(默认为'/bin/mail')
-s, --state=statefile # 设置logrotate.status文件路径,可用于区分在同
# 一系统下以不同用户身份运行的logrotate任务
-v, --verbose # 显示配置详细信息
-l, --log=STRING # 将Logrotate执行的详情输出到指定的文件
-usage #显示指令基本用法。
logrotate -v /etc/logrotate.conf # 显示配置文件详细信息
logrotate -d /etc/logrotate.d/syslog -l /var/log/logrotate.log # 配置文件,执行测试
logrotate -f /etc/logrotate.d/syslog # 立即执行当前配置文件
一般CentOS 系统默认自带的,请无视这一步。
常用参数如下(示例):
指令 指令说明
归档执行周期
hourly #日志归档周期为 1 小时,默认 Logrotate 的最小周期为 1 天,需额外调整该参数才可生效
daily #日志归档周期为 1 天
weekly #日志归档周期为 1 周
monthly #日志归档周期为 1 月,通常为每月的第一天
归档执行条件
include #读取外部参数文件
missingok #如果日志文件不存在,则不显示错误信息
nomissingok #如果日志文件不存在,则显示错误信息。默认配置
size #日志文件可被归档的最小值
minsize #日志文件可被归档的最小值,没到归档周期执行时间,不会执行归档操作
maxsize #日志文件超过设定值时,即使没到归档周期执行时间,也会执行归档操作
ifempty #即使日志文件为空,也执行归档操作
notifempty #如果日志文件为空,则不进行归档。默认设置
tabooext #不对设置扩展名的日志文件执行归档操作
归档文件命名
start count #使用日志文件归档次数作为归档文件扩展名,count 默认值为 1,默认配置
dateext #为归档文件名添加日期,默认追加到扩展名后
dateformat #设置归档文件名中的日期格式,使用“%Y%m%d%H”作为说明符,默认为-%Y%m%d
dateyesterday #使用前一天的日期而非创建归档文件时的日期作为归档文件的文件名中的日期
extension #指定日志的扩展名,并将其设置为归档文件的扩展名,启用压缩时,压缩的扩展名在最后
compressext #启用压缩时,自定义归档文件扩展名,如将“.gz”改为“.ddd”
归档文件保存方式
compress #对归档文件启用压缩,默认为 gzip 压缩
nocompress #不压缩归档文件。默认设置
compresscmd #指定压缩归档文件的命令,默认为 gzip 压缩
uncompresscmd #指定解压归档文件的命令,默认为 gunzip 解压
compressoptions #启用压缩时,设置压缩工具的命令选项
delaycompress #在下一个归档周期再对当前归档文件进行压缩
nodelaycompress #不延迟压缩。默认设置
归档执行方式
copy #为日志文件复制一个副本后再进行归档
nocopy #不复制源日志文件。默认配置
copytruncate #复制日志文件后清空日志文件的内容
nocopytruncate #复制源日志文件后,不清空源文件。默认设置
create mode owner group, create owner group #重命名日志文件,创建与日志文件同名的文件,默认 mode=0644 uid=0 gid=0,与 copy 指令不能同时使用
nocreate #不创建与日志文件同名的文件。默认设置
olddir #设置归档文件保存目录
noolddir #归档文件与源文件在同一目录。默认设置
createolddir mode owner group #如果 olddir 参数指定的目录不存在,则创建目录并指定属组,默认 mode = 0777 uid = 0 gid = 0
nocreateolddir #当 olddir 参数设定目录不存在时,不创建目录。默认设置
prerotate … endscript #归档执行之前执行脚本,日志文件名为传入的第一个参数
postrotate … endscript #归档执行之后执行脚本,日志文件名为传入的第一个参数
firstaction … endscript prerotate #脚本之前,仅当第一个日志文件被开始执行归档操作时才执行脚本,日志文件名为传入的第一个参数
lastaction … endscript postrotate #脚本之后,仅当最后一个日志文件执行归档操作结束时才执行脚本,日志文件名为传入的第一个参数
preremove … endscript #删除日志文件之前执行脚本,日志文件名为传入的第一个参数
sharedscripts #当匹配的日志文件为多个时,prerotate 和 postrotate 脚本会在每个日志文件执行归档操作时都执行一次,启用共享模式会让 prerotate 和 postrotate 脚本在全局只运行一次
nosharedscripts #当匹配的日志文件为多个时,prerotate 和 postrotate 脚本会在每个日志文件执行归档操作时都执行一次。默认设置
su user group #指定操作源文件执行归档操作的用户及属组
归档文件清理
mail #设置接收归档文件的邮件地址
nomail #不将归档文件发送到任何邮件地址
mailfirst #将刚生成的归档文件发送到设置的邮箱
maillast #将要超过 maxage 设置时间的归档文件发送到设置的邮箱
mахage #设置过期归档文件的天数
rotate #保留归档文件数,默认为 0
shred #彻底删除
shredcycles count #彻底删除时,覆盖文件的次数,默认为 3
noshred #不彻底删除
关于上表有以下几点需要说明:
copy 与 create 是两种互斥的归档执行方式;
copy 方式是将日志文件复制一份后清空原日志文件的内容,并对复制的文件进行归档操作,应用程序继续向原日志文件输出日志。因日志文件复制与清空操作存在时间间隔,所以切割操作会因日志量的大小及实时产生的频率存在丢失的情况;
create 方式是将日志文件重命名,因日志文件的 inode 编号不变,应用程序会向新命名的文件输出日志。Logrotate 新创建原日志文件名的文件后执行重启或以信号机制通知应用程序重新向新日志文件输出日志内容,完成切割操作;
当与同一自定义配置匹配的日志文件为多个时,会并发执行归档操作。
cd /etc/logrotate.d/
在该目录下新建nginx/nginxLogrotate。在nginxLogrotate文本中配置下方相关切割参数信息。
我的配置(示例):
/opt/nginx-1.20.0/logs/access.log { #日志文件的路径
daily #每天切割
rotate 15 #日志保留15份
missingok #日志不存在分析,分析下一个
notifempty #空文件不转储
nocompress #被切割的日志文件不需要压缩
dateext #日志切割后,文件以当前日志为结尾,例如:access-logs-20211128
sharedscripts #整个日志组运行一次脚本
postrotate #开始脚本
if [ -f /opt/nginx-1.20.0/logs/nginx.pid ]; then #判断nginx是否启动
/opt/nginx-1.20.0/sbin/nginx -s reload #重启nginx
fi
/bin/kill -HUP `cat /opt/nginx-1.20.0/logs/nginx.pid 2> /dev/null` 2> /dev/null || true #防止切割的新日志文件出现旧日志
endscript #结束脚本
}
我这里采用的是 自定义logrotate配置文件。
systemctl restart rsyslog
crontab –e
添加内容:
59 23 * * * /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.d/nginx/nginxLogrotate >/dev/null 2>&1
添加一个cron任务,它将在每天的23点59分执行logrotate命令。具体来说,这个任务将会执行/usr/sbin/logrotate,使用选项指定状态文件路径为/var/lib/logrotate/logrotate.status,并指定要轮换的文件配置路径为/etc/logrotate.d/nginx/nginxLogrotate。这个任务的意思如下:
这个任务的作用是定期轮换nginx的日志文件,以避免日志文件过大而导致磁盘空间问题。通过设置定时任务,您可以确保每天都会轮换日志文件,并保留指定数量的日志文件。
crontab -l
可以看到定时任务已经添加成功
logrotate -f /etc/logrotate.d/nginx/nginxLogrotate
这将强制执行logrotate,并按照配置文件中的规则切割日志文件。
cd /opt/nginx-1.20.0/logs
ll
效果图:
查看Cron的日志文件(通常位于/var/log/cron或/var/log/messages),以查看是否有关于该任务的任何错误或警告信息。