查看linux系统内logrotate
logrotate --version1. 创建一个命名nginx的文件
第一行和第二行修改为你的nginx日志目录
create 0640 root root 其中 root 修改为自己实际运行的用户
倒数第四行中 nginx.pid 修改为你的nginx的pid目录
#根据日志是否达到500M分割日志,分割的日志根据当前日期
/usr/local/nginx/logs/access.log
/usr/local/nginx/logs/error.log {
dateext
dateformat -%Y-%m-%d
size 500M
missingok
rotate 60
compress
delaycompress
notifempty
create 0640 root root
sharedscripts
postrotate
# 通知Nginx重新打开日志文件(关键!请确保PID路径正确)
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
fi
endscript
}
#每日分割一次日志,分割的日志根据当前日期
/usr/local/nginx/logs/access.log
/usr/local/nginx/logs/error.log {
dateext
dateformat -%Y-%m-%d
daily
missingok
rotate 60
compress
delaycompress
notifempty
create 0640 root root
sharedscripts
postrotate
# 通知Nginx重新打开日志文件(关键!请确保PID路径正确)
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
fi
endscript
}
#上面两个选一个配置即可2. nginx 放入 /etc/logrotate.d/ 中
3. 测试是否配置成功
sudo logrotate -d /etc/logrotate.d/nginx # 调试模式,验证配置是否正确sudo logrotate -vf /etc/logrotate.d/nginx # 强制立即执行一次切割并显示详细输出4. 设置每小时运行一次
sudo crontab -e添加一行
0 * * * * /usr/sbin/logrotate -s /etc/logrotate.d/nginxsudo crontab -l 查看添加的行是否一致
查看运行计划是否执行
tail -f /var/log/cron如果不设置 cron 默认每天运行一次 /etc/logrotate.d/ 文件下所有文件
5. 扩展
1. 如果分割日志后,新的日志文件一直为空,日志一直写入到了旧的文件中,需要添加一下几行代码
出现以上原因是因为logrotate分割日志后应用程序的写入句柄没有更新,应用程序还是会把日志写入到旧的日志文件中。

#第一个方法
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 root root
su root root
sharedscripts
copytruncate #添加这一行,这个选项让 logrotate 先将当前日志文件复制一份作为备份,然后清空原文件,而不是移动它。这样应用程序持有的文件句柄仍然指向被清空的原文件。
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
#第二个方法
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 root root
su root root
sharedscripts
killall -HUP nginx #添加这一行,如果应用支持,发送特定信号重新打开日志
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
2. 问题 windows 的换行符在 linux 上不可使用
使用vim打开文件,
进入“末行模式”,输入:set ff=unix回车执行,告诉编辑器改为unix换行符
输入:w回车,完成保存3. 如果出现 logrotate 执行错误 lines must begin with a keyword or a filename (possibly in double quotes)
具体可前往 https://blog.csdn.net/utopia/article/details/103631734 查看
4. 如果强制执行 sudo logrotate -vf /etc/logrotate.d/nginx 不成功。
access.log 或者 error.log 文件里面内容必须要有数据才会分割。
5. 如果出现 set su directive in config considering log 这个错误。
#linux登录的用户为root
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 root root
su root root # 添加这行
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}