Nginx日志按天分割和优化是服务器管理的重要环节,可以有效管理日志文件、提高分析效率并节省存储空间。以下是详细的优化方案:
logrotate是Linux系统自带的日志管理工具,配置方法:
sudo vim /etc/logrotate.d/nginx
添加以下内容:
/var/log/nginx/*.log {
daily
missingok
rotate 365
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
参数说明:
- daily
: 每天轮转
- rotate 365
: 保留365天的日志
- compress
: 压缩旧日志
- delaycompress
: 延迟一天压缩
- create
: 新日志文件权限
修改nginx配置:
http {
log_format custom '$time_iso8601 $remote_addr "$request" $status';
access_log /var/log/nginx/access-${year}${month}${day}.log custom;
map $time_iso8601 $year {
default '0000';
'~^(?<y>\d{4})-' $y;
}
map $time_iso8601 $month {
default '00';
'~^\d{4}-(?<m>\d{2})-' $m;
}
map $time_iso8601 $day {
default '00';
'~^\d{4}-\d{2}-(?<d>\d{2})' $d;
}
}
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
# 排除静态文件日志
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
access_log off;
}
# 排除健康检查日志
location = /healthcheck {
access_log off;
}
access_log /var/log/nginx/access.log main buffer=32k flush=5m;
error_log /var/log/nginx/error.log warn;
创建日志清理脚本/usr/local/bin/nginx_log_clean.sh
:
#!/bin/bash
# 保留最近30天的日志
find /var/log/nginx/ -name "*.log" -mtime +30 -exec rm -f {} \;
# 重新加载nginx
nginx -s reload
添加到crontab:
0 0 * * * /usr/local/bin/nginx_log_clean.sh
将日志发送到Elasticsearch集群,使用Kibana可视化分析。
# 实时监控错误日志
tail -f /var/log/nginx/error.log | grep -E 'error|crit|alert|emerg'
# 每月归档压缩
find /var/log/nginx/ -name "*.log" -mtime +30 -exec gzip {} \;
通过以上优化,可以实现Nginx日志的高效管理,既方便问题排查,又不会占用过多存储资源。