Ubuntu Nginx日志管理技巧
Nginx默认生成两种核心日志:access.log(记录HTTP请求,含状态码、响应时间、客户端IP等)和error.log(记录错误与警告,如502、权限问题)。需先确认其路径:
grep -r "access_log\|error_log" /etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf
默认路径通常为/var/log/nginx/access.log和/var/log/nginx/error.log。
优化方向:
warn(避免debug日志洪流),调试时临时设为debug(分析后恢复):error_log /var/log/nginx/error.log warn; # 生产环境推荐
location /static {
access_log off;
alias /var/www/static;
}
使用logrotate工具实现日志自动切割、压缩与清理,避免日志文件过大占满磁盘。
步骤:
/etc/logrotate.d/下新建nginx文件:sudo nano /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 每天轮转(可选:weekly/monthly)
missingok # 日志文件不存在时不报错
rotate 30 # 保留30个历史文件(即30天)
compress # 启用gzip压缩(节省空间)
delaycompress # 延迟压缩(保留access.log.1为明文,便于应急排查)
notifempty # 空文件不轮转
create 0640 www-data adm # 轮转后新日志权限(Ubuntu下Nginx用户多为www-data)
sharedscripts # 所有日志切割完成后统一执行postrotate
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid); # 向Nginx主进程发送信号,重新打开日志文件
fi
endscript
}
sudo logrotate -d /etc/logrotate.d/nginx # 调试模式(dry-run,不实际执行)
sudo logrotate -f /etc/logrotate.d/nginx # 强制立即执行
ls -lht /var/log/nginx/ | head -n 5 # 查看最新日志文件(应生成access.log.1等)
若需临时清理或切割日志(如日志即将占满磁盘),可使用以下命令:
sudo mv /var/log/nginx/access.log /var/log/nginx/access.$(date +%Y%m%d).log
sudo mv /var/log/nginx/error.log /var/log/nginx/error.$(date +%Y%m%d).log
sudo kill -USR1 $(cat /var/run/nginx.pid) # 重新打开日志
# 删除7天前的.log文件
sudo find /var/log/nginx/ -type f -name "*.log" -mtime +7 -exec rm -f {} \;
# 删除7天前的.gz压缩文件
sudo find /var/log/nginx/ -type f -name "*.gz" -mtime +7 -exec rm -f {} \;
map $status $loggable {
~^[2] 1; # 2xx状态码记录
default 0; # 其他状态码不记录
}
access_log /var/log/nginx/access.log combined if=$loggable;
access_log /var/log/nginx/access.log combined buffer=64k flush=5m;
tail或multitail工具跟踪日志:tail -f /var/log/nginx/access.log | grep ' 500 ' # 监控500错误
sudo apt install multitail && multitail -i /var/log/nginx/access.log -i /var/log/nginx/error.log # 同时监控多个日志
df命令监控日志分区使用率,超过阈值(如80%)触发告警:df -h /var/log | awk 'NR==2 {print $5}' | sed 's/%//' # 获取日志分区使用率
# 结合cron定时任务,每天发送告警(示例)
echo "日志分区使用率:$(df -h /var/log | awk 'NR==2 {print $5}')"
通过以上技巧,可实现Nginx日志的高效管理,平衡日志保留需求与磁盘空间占用,提升运维效率。