Nginx 日志切割对于日志管理和系统维护至关重要。以下是几种常见的 Nginx 日志切割方法:
logrotate 是 Linux 系统中用于管理日志文件的工具,可以按时间或大小对日志文件进行切割、压缩和清理。以下是使用 logrotate 进行 Nginx 日志切割的步骤:
创建 logrotate 配置文件:
在 /etc/logrotate.d/ 目录下创建一个新的配置文件,例如 nginx。配置文件示例如下:
/var/log/nginx/access.log {
daily # 按天切割日志
rotate 30 # 保留 30 个日志文件
missingok # 如果日志文件不存在,则不报错
notifempty # 如果日志文件为空,则不进行轮替
compress # 压缩旧日志文件
delaycompress # 延迟压缩上一个周期的日志文件
create 0640 www-data www-data # 新日志文件的权限和所有者
sharedscripts # 共享脚本,等 access 和 error 两个日志都轮转之后再执行下面的脚本
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid) # 向 Nginx 发送 USR1 信号,重开日志文件
fi
endscript
}
/var/log/nginx/error.log {
daily # 按天切割日志
rotate 30 # 保留 30 个日志文件
missingok # 如果日志文件不存在,则不报错
notifempty # 如果日志文件为空,则不进行轮替
compress # 压缩旧日志文件
delaycompress # 延迟压缩上一个周期的日志文件
create 0640 www-data www-data # 新日志文件的权限和所有者
sharedscripts # 共享脚本
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid) # 重启 Nginx 日志进程
fi
endscript
}
测试配置: 使用以下命令测试配置文件是否正确:
sudo logrotate -vf /etc/logrotate.conf
设置定时任务:
使用 crontab 设置定时任务,使 logrotate 每天执行日志切割。例如,每天凌晨 0 点执行:
0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx
除了使用 logrotate,还可以编写自定义脚本来实现日志切割。以下是一个简单的 Bash 脚本示例:
#!/bin/bash
# 指定日志路径和备份目录
LOG_PATH="/usr/local/nginx/logs"
BACKUP_PATH="/var/log/nginx/backup"
# 获取当前日期并生成备份目录
DATE=$(date +"%Y-%m-%d")
BACKUP_DIR="$BACKUP_PATH/$DATE"
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 移动并重命名日志文件
mv "$LOG_PATH/access.log" "$BACKUP_DIR/access_$DATE.log"
mv "$LOG_PATH/error.log" "$BACKUP_DIR/error_$DATE.log"
# 通知 Nginx 重新生成新的日志文件
kill -USR1 $(cat "$LOG_PATH/nginx.pid")
设置定时任务:
使用 crontab 设置定时任务,使脚本每天执行日志切割。例如,每天凌晨 1 点执行:
0 1 * * * /path/to/your/script.sh
无论使用哪种方法,都可以通过以下命令验证日志切割是否按预期工作:
检查日志文件是否已切割:
tail -n 4 /var/log/nginx/access.log
tail -n 4 /var/log/nginx/access.log.1
重新加载 Nginx 配置以应用更改:
sudo nginx -s reload
通过以上方法,可以有效地管理和维护 Nginx 日志文件,确保系统的稳定性和性能。