余文生 发表于 2023-5-26 17:23:24

linux服务器,nginx日志切割保存

我们都知道,默认情况下,nginx的项目log是一直被累计写入的,随着时间越久,那么这个文件就会越大,这个时候如果我们要去做一些查找和排查就会比较困难,因为日志文件太大,操作起来比较费劲。
因此我们为了规避这个问题,提出日志切割的方案。
那日志切割的原理是怎么样的,我们来分析一下,我们先统计下连续10天的日志文件情况
-rw-r--r-- 1 nginx root   60M May 1 10:28 xxx.com.access.log
-rw-r--r-- 1 nginx root   100M May 2 10:28 xxx.com.access.log
-rw-r--r-- 1 nginx root   200M May 3 10:28 xxx.com.access.log
-rw-r--r-- 1 nginx root   500M May 4 10:28 xxx.com.access.log
-rw-r--r-- 1 nginx root   800M May 5 10:28 xxx.com.access.log
-rw-r--r-- 1 nginx root   1G May 6 10:28 xxx.com.access.log
-rw-r--r-- 1 nginx root   1.5G May 7 10:28 xxx.com.access.log
-rw-r--r-- 1 nginx root   2G May 8 10:28 xxx.com.access.log
-rw-r--r-- 1 nginx root   2.5G May 9 10:28 xxx.com.access.log
-rw-r--r-- 1 nginx root   2.9G May 10 10:28 xxx.com.access.log我们可以发现,日志每天都在变大,时间越久,就越大,那么我们切割,应该按照什么规则来切割呢?
一般情况下,我们都是按日期来切割,例如:
xxx.com.access.log20230501的日志保存为一个文件,表示5-1的日志,
xxx.com.access.log20230502的日志保存为一个文件,表示5-2的日志,
xxx.com.access.log20230503的日志保存为一个文件,表示5-3的日志,
。。。。。。
也就是每天的日志保存一个文件,至于保存多久,根据实际情况而定,3天,10天,30天,60天,更久都可以,只是保留的天数越多,文件个数就越多而已
理解了这个思路,那么我们接下来要做的事情就是从xxx.com.access.log里面把指定日期的日志提取出来并单独保存为一个文件,我们使用脚本来实现:
#!/bin/bash
# Nginx日志切割

# 在/data/log/nginx目录下生成类似xxx.log20230526格式的日志,并保留前30天数据
# 创建计划任务,每天0点0分执行:0 0 * * * /data/script/nginx_log_rotation.sh
<br>#你的日志所在目录
LOG_PATH=/data/logs/nginx<br><br>#你的nginx服务运行的pid文件
PID=/usr/local/nginx/logs/nginx.pid<br><br>#昨天的日期
YESTERDAY=`date -d "yesterday" +%Y-%m-%d`
<br>#因为日志目录里面可能有多个项目,这里我们使用循环读取的方式
for i in `find ${LOG_PATH} -maxdepth 1 -type f|grep -v '$'`; do
    mv $i $i${YESTERDAY}
done
<br>#重新生成一个新的日志文件,用来保存新的数据
kill -USR1 `cat ${PID}`
<br>#删除创建时间在30天以前的日志文件
find ${LOG_PATH} -mtime +30 -name "*" | xargs rm -f
exit 0通过试验,我发现上面标红那句话说的不是很准确,因此来纠正一下
05-20项目上线,不管是什么时间点,早上,上午,下午,还是晚上都一样,xxx.com.access.log持续写入日志,那么这些日志的日期肯定都是05-20
然后05-21 00:00:00的时候执行一次脚本,通过mv命令把xxx.com.access.log日志(日期全是05-20)重命名为xxx.com.access.log20230520,并重新生成了一个空的xxx.com.access.log文件,用于继续写入日志,此时再写入的日志的日期已经是05-21了
然后05-22 00:00:00的时候执行一次脚本,通过mv命令把xxx.com.access.log日志(日期全是05-21)重命名为xxx.com.access.log20230521,并重新生成了一个空的xxx.com.access.log文件,用于继续写入日志,此时再写入的日志的日期已经是05-22了
然后05-23 00:00:00的时候执行一次脚本,通过mv命令把xxx.com.access.log日志(日期全是05-22)重命名为xxx.com.access.log20230522,并重新生成了一个空的xxx.com.access.log文件,用于继续写入日志,此时再写入的日志的日期已经是05-23了
。。。。。。
以此内推,结论是:每日凌晨0点把前一天的日志文件按日期重命名,并生成一个新的日志文件,用来写入当天的日志,而不是刚开始理解的按日期去xxx.com.access.log里面提取指定日期的日志了。
当然了,在重命名文件的时候,同步写入数据日期可能是第二天的数据(也就是xxx.com.access.log20230520文件里面最后一条数据是05-21的),或者数据丢失的情况,我们可以忽略不计哈。
 

来源:https://www.cnblogs.com/firstlady/p/17434396.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: linux服务器,nginx日志切割保存