nginx之日志切割

方便查看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 "

 

posted @ 2022-08-01 14:00  X-Wolf  阅读(4941)  评论(0编辑  收藏  举报