一、从源头减少日志负担:通过精简格式、调整级别、过滤无关请求和启用缓冲,有效优化日志生成,降低存储与I/O压力。

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 {dailymissingokrotate 7compressdelaycompressnotifemptycreate 0640 www-data admsharedscriptspostrotateif [ -f /var/run/nginx.pid ]; thenkill -USR1 `cat /var/run/nginx.pid`fiendscript}cut_nginx_log.sh),通过mv重命名日志文件,再发送USR1信号。示例:#!/bin/bashLOG_PATH="/var/log/nginx"DATE=$(date -d "yesterday" +%Y-%m-%d)mv $LOG_PATH/access.log $LOG_PATH/access-$DATE.logmv $LOG_PATH/error.log $LOG_PATH/error-$DATE.logkill -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).logfind命令查找并删除超过指定天数(如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.htmlawk '{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。