nginx自动切割服务器日志

Web 访问日志 (access_log) 记录了所有外部客户端对Web服务器的访问行为,包含了客户端IP,访问日期,访问的URL资源,服务器返回的HTTP状态码等重要信息。
一条典型的Web访问日志如下:

112.97.37.90 - - [14/Sep/2013:14:37:39 +0800] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; Lenovo A326 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.259" -

当网站访问量大后,日志数据就会很多,如果全部写到一个日志文件中去,文件会变得越来越大。文件大速度就会慢下来,比如一个文件几百兆。写入日志的时候,会影响操作速度。另外,如果我想看看访问日志,一个几百兆的文件,下载下来打开也很慢。使用第三方免费的日志分析工具-日志宝,可以上传nginx、apache、iis的日志文件,它们帮助分析网站安全方面。毕竟专攻,更加专业。日志宝对上传的文件也是做了大小限制的,不超过50m。

.

nignx没有自动分开文件存储日志的机制。由于nginx它不会帮你自动分文件保存。所以,需要自己编写脚本来实现。

shell脚本文件cut_nginx_logs.sh内容如下:

#set the path to nginx log files
log_files_path="/home/wwwlogs/"
log_files_dir=${log_files_path}$(date -d "yesterday" +"%m")$(date -d "yesterday" +"%d")
#set nginx log files you want to cut
log_files_name=(m.xxoo.com www.xxoo.com)
#set the path to nginx.
nginx_sbin="/usr/local/nginx/sbin/nginx"
#Set how long you want to save
save_days=30

mkdir -p $log_files_dir

log_files_num=${#log_files_name[@]}

#cut nginx log files
for((i=0;i<$log_files_num;i++));do
mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}.log
done

#delete 30 days ago nginx log files
find $log_files_path -mtime +$save_days -exec rm -rf {} \; 

$nginx_sbin -s reload

cut_nginx_logs.sh写好后,扔到服务器的某个目录下,比如/root/lnmp1.1-full/

下面就用到crontab定时任务管理器了。

在SSH工具里,输入crontab -e命令(如果没有安装,运行yum install vixie-cron 一键安装),输入如下内容:

00 05 * * * /bin/bash /root/lnmp1.1-full/cut_nginx_logs.sh

表示我们要每天00:05的时候执行分割任务,按Esc键盘,输入 :wq! 回车,保存后重新加载一下crontab的配置就OK了。