一、优化日志生成:从源头减少日志负担
log_format指令定义仅包含关键信息的格式(如$remote_addr、$status、$request_time、$body_bytes_sent),移除冗余字段(如$http_cookie、$host),降低单条日志大小。例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time';
access_log /var/log/nginx/access.log main;
error_log从debug改为info或warn),避免记录过多调试信息。例如:error_log /var/log/nginx/error.log warn;
location指令忽略静态资源(如.jpg、.css、.js)的访问日志,或使用map指令仅记录错误请求(如非2xx/3xx状态码)。例如:location ~* \.(jpg|css|js|ico)$ { access_log off; }
map $status $loggable { ~^[23] 0; default 1; }
access_log /var/log/nginx/errors.log main if=$loggable;
access_log指令的buffer和flush参数,将日志暂存内存后批量写入磁盘,减少I/O次数。例如:access_log /var/log/nginx/access.log main buffer=64k flush=5m;
二、定期轮转日志:控制文件大小与数量
/etc/logrotate.d/nginx配置文件设置自动轮转规则,关键参数包括:
daily/weekly/monthly:轮转周期;rotate 7:保留最近7个日志文件;compress:压缩旧日志(节省空间);notifempty:空日志不轮转;postrotate:发送USR1信号让Nginx重新打开日志文件(避免文件占用)。示例配置:/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
cut_nginx_log.sh),通过mv重命名日志文件,再发送USR1信号。例如:#!/bin/bash
LOG_PATH="/var/log/nginx"
DATE=$(date -d "yesterday" +%Y-%m-%d)
mv $LOG_PATH/access.log $LOG_PATH/access-$DATE.log
mv $LOG_PATH/error.log $LOG_PATH/error-$DATE.log
kill -USR1 $(cat /var/run/nginx.pid)
通过crontab -e设置定时任务(如每天凌晨执行):0 0 * * * /path/to/cut_nginx_log.sh >> /var/log/log_cut.log 2>&1
三、压缩与清理:释放存储空间
logrotate配置中添加compress参数(如gzip压缩),或通过Shell脚本调用gzip命令。例如:gzip /var/log/nginx/access-$(date -d "yesterday" +%Y-%m-%d).log
find命令查找并删除超过指定天数(如30天)的压缩日志。例如:find /var/log/nginx/backup -type f -name "*.gz" -mtime +30 -exec rm -f {} \;
将上述命令添加到crontab(如每月1号执行):0 1 * * * /path/to/log_cleanup.sh >> /var/log/log_cleanup.log 2>&1
四、高效分析与监控:挖掘日志价值
goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/html/report.html
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10;awk '{print $NF,$7}' access.log | sort -nr | head -20;awk '{print $9}' access.log | sort | uniq -c | sort -rn;awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -nr。