方便查看nginx日志, 平常会将nginx日志进行每日切割处理. 这里介绍 平常比较常用的两种方式
1. logrotate
在linux上logrotate是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用,它是默认随linux一起被安装的。
如果不存在的话, 可以进行手动安装
yum -y install logrotate
Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,内容如下:
[root@huanqiu_web1 ~]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1 EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0
1)日志轮询周期有这几种:
daily、weekly、monthly、yearly
默认是daily(即logrotate脚本放到了/etc/cron.daily下),具体执行时间可以查看 /etc/crontab 或者 /etc/anacrontab (CentOS)。
/etc/cron.daily/logrotate
注意点: logrotate是基于crontab运行的, 所以这个时间点是有crontab控制的, 具体可以查询crontab的配置文件/etc/anacrontab. 系统会按照计划的频率运行logrotate,通常是每天
2)手动执行:
如果等不及cron自动执行日志轮转,想手动强制切割日志,需要加-f参数;
# /usr/sbin/logrotate -f /etc/logrotate.d/nginx
不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要
logrotate [OPTION...] <configfile> -d, --debug :debug模式,测试配置文件是否有错误,不真实执行。 -f, --force :强制转储文件。 -m, --mail=command :压缩日志后,发送日志到指定邮箱。 -s, --state=statefile :使用指定的状态文件。 -v, --verbose :显示转储过程。
默认日志保存在: cat /var/lib/logrotate/logrotate.status , 如果需要指定其他文件, 可以通过-s/--state参数指定
4)logrotate配置:
默认使用 /etc/logrotate.conf 文件,作为全局配置,而不同应用的具体配置则在 /etc/logrotate.d 目录下,通常以应用程序的名称命名,例如 nginx、mysql、syslog、yum 等配置。
例如:
/var/log/nginx/*.log /var/log/tomcat/*log { # 可以指定多个路径 daily # 日志轮询周期,weekly,monthly,yearly rotate 30 # 保存30天数据,超过的则删除 size +100M # 超过100M时分割,单位K,M,G,优先级高于daily compress # 切割后压缩,也可以为nocompress delaycompress # 切割时对上次的日志文件进行压缩 dateext # 日志文件切割时添加日期后缀 missingok # 如果没有日志文件也不报错 notifempty # 日志为空时不进行切换,默认为ifempty create 640 nginx nginx # 使用该模式创建日志文件 sharedscripts # 所有的文件切割之后只执行一次下面脚本 postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript }
当配置完成后,可以通过如下方式进行测试。
----- 可直接手动执行 $ logrotate --force /etc/logrotate.d/nginx ----- 显示详细的信息;而且--debug/-d实际上不会操作具体文件(Dry Run) $ logrotate --debug --verbose --force /etc/logrotate.d/nginx
常见配置参数:
daily :指定转储周期为天天 weekly :指定转储周期为每周 monthly :指定转储周期为每个月 rotate count :指定日志文件删除以前转储的次数,0指没有备份,5 指保留5 个备份 tabooext [+] list:让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ missingok:在日志轮循期间,任何错误将被忽略,例如“文件没法找到”之类的错误。 size size:当日志文件到达指定的大小时才转储,bytes(缺省)及KB(sizek)或MB(sizem) compress: 经过gzip压缩转储之后的日志 nocompress: 不压缩 copytruncate:用于还在打开中的日志文件,把当前日志备份并截断 nocopytruncate: 备份日志文件可是不截断 create mode owner group : 转储文件,使用指定的文件模式建立新的日志文件 nocreate: 不创建新的日志文件 delaycompress: 和 compress 一块儿使用时,转储的日志文件到下一次转储时才压缩 nodelaycompress: 覆盖 delaycompress选项,转储同时压缩。 errors address : 专储时的错误信息发送到指定的Email 地址 ifempty :即便是空文件也转储,这个是logrotate 的缺省选项。 notifempty :若是是空文件的话,不转储 mail address : 把转储的日志文件发送到指定的E-mail地址 nomail : 转储时不发送日志文件 olddir directory:储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 noolddir: 转储后的日志文件和当前日志文件放在同一个目录下 prerotate/endscript: 在转储之前须要执行的命令能够放入这个对,这两个关键字必须单独成行
2. 通过shell脚本定时执行切割
#!/bin/bash dat=`date +"%Y%m%d" ` mon=`date +"%Y%m"` echo $dat nginx_path="/data/log/nginx/" mondir=$nginx_path$mon /bin/echo $mondir if [ ! -x "$mondir" ]; then echo "开始创建日期文件夹" mkdir "$mondir" echo "创建日期文件夹结束" fi /bin/echo `date +"%Y-%m-%d %H:%M:%S"` /bin/echo ` ls -al $mondir` # 声明需要分割的日志文件 logs=("access_xxx.com" "nginx_access" "nginx_error") for log_name in ${logs[@]} do echo $log_name mv $nginx_path$log_name".log" $mondir/$log_name-$dat".log" done kill -USR1 `cat /var/run/nginx.pid` /bin/echo "done "