===============================================

2019/4/6_第2次修改                       ccb_warlock

2019/4/6:修复原先脚本无法正确保存日志的问题;

===============================================

配置了记录日志的nginx,在运行较长时间后,产生的日志文件(access.log)会越来越大。

日志文件过大会带来下面的问题:

  • 查询过大的日志文件对于开发和运维十分不方便,特别是加班人很累的情况下更加雪上加霜;
  • 很久以前的日志文件几乎没有价值,但是手工清理又太过繁琐;

这时候就需要一种解决方案可以自动来做日志分割,分割后的日志不仅“干净”,也便于实现日志定时清理。

由于目前的nginx使用docker部署,而公司的业务大都需要nginx始终运行,网上的“停nginx,分割,重启nginx”的方案并不适合,故对网上的方案进行了改进,使得目前的方案也能适应业务运行要求。


一、前提条件

  • 本次部署docker的基础os选择centos 7
  • 本次通过swarm的stack方式部署了nginx容器(https://www.cnblogs.com/straycats/p/9388219.html
  • 本次nginx容器的日志文件持久化在宿主机的目录(/usr/docker-vol/nginx/logs)下
  • 本次每天0:00做日志切割,将切割后的日志文件(access.log、error.log)存放在宿主机的目录(/usr/docker-vol/nginx/logs-bak)下
  • 期望的日志备份目录结构:
    1级目录:4位年-2位月
    2级目录:4位年-2位月-2位日
    3级目录:存放切割后备份的日志文件


二、配置nginx容器的日志切割

2.1 编辑cutlogs.sh

mkdir -p /opt/sh
vi /opt/sh/cutlogs.sh

# 将下面的内容添加到cutlogs.sh内,wq保存。

#!/bin/bash

# 指定日志和切割后日志备份的目录
YEAR=$(date +%Y)
MONTH=$(date +%m)
DAY=$(date +%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
LOGS_PATH=/usr/docker-vol/nginx/logs
LOGS_BAK_PATH=/usr/docker-vol/nginx/logs-bak # 得到1级目录名
if [[ $(($DAY)) -eq 1 ]]
then
if [[ $(($MONTH)) -eq 1 ]]
then
LOGS_BAK_PATH=$LOGS_BAK_PATH/$((${YEAR}-1))-12
else
if [[ $(($MONTH)) -gt 10 ]]
then
LOGS_BAK_PATH=$LOGS_BAK_PATH/${YEAR}-$((${MONTH}-1))
else
LOGS_BAK_PATH=$LOGS_BAK_PATH/${YEAR}-0$((${MONTH}-1))
fi
fi
else
LOGS_BAK_PATH=$LOGS_BAK_PATH/${YEAR}-${MONTH}
fi # 创建目录
mkdir -p $LOGS_BAK_PATH/${YESTERDAY} # 复制当前的日志文件到备份的目录
cp ${LOGS_PATH}/access.log ${LOGS_BAK_PATH}/${YESTERDAY}/access_${YESTERDAY}.log
cp ${LOGS_PATH}/admin_access.log ${LOGS_BAK_PATH}/${YESTERDAY}/admin_access_${YESTERDAY}.log
cp ${LOGS_PATH}/error.log ${LOGS_BAK_PATH}/${YESTERDAY}/error_${YESTERDAY}.log # 清空日志
> ${LOGS_PATH}/access.log
> ${LOGS_PATH}/admin_access.log
> ${LOGS_PATH}/error.log

2.2 给cutlogs.sh增加权限

chmod 777 /opt/sh/cutlogs.sh

PS.在创建定时任务之前,可以用下面的命令先试验脚本是否存在问题

bash /opt/cutlogs.sh

三、创建定时任务

3.1 编辑crontab

vi /etc/crontab

# 将下面的内容添加到crontab文件中,wq保存。

# 每天0:00执行该脚本
0 0 * * * root bash /opt/sh/cutlogs.sh

3.2 重启crontab

systemctl restart crond

根据这个方案切割后的日志文件会根据这样的结构进行存放。


后话:

不停机做日志切割可能会出现日志记录丢失的情况(即拷贝走、清空源文件之间会有时间间隔),但是对于目前的业务,一天的日志信息量不大且丢失的日志对于整天的日志来说犹如沧海一粟,故现在先用这个方案来解决docker部署后的nginx日志切割。


参考资料:

1.http://www.cnblogs.com/wjoyxt/p/4757093.html

2.https://blog.csdn.net/linglongwunv/article/details/5212700

3.http://www.cnblogs.com/wjoyxt/p/4757093.html

4.https://www.cnblogs.com/aaronLinux/p/7074725.html

nginx 日志切割(也适用于docker)的更多相关文章

  1. linux shell:nginx日志切割脚本

    需求原因:nginx不具备日志切割功能,日志量较大,方便分析. 实现目的:完成nginx日志切割,并根据时间命名   简要命令: mv /usr/local/tengine/logs/access.l ...

  2. nginx日志切割并使用flume-ng收集日志

    nginx的日志文件没有rotate功能.如果你不处理,日志文件将变得越来越大,还好我们可以写一个nginx日志切割脚本来自动切割日志文件.第一步就是重命名日志文件,不用担心重命名后nginx找不到日 ...

  3. Nginx访问日志、 Nginx日志切割、静态文件不记录日志和过期时间

    1.Nginx访问日志 配制访问日志:默认定义格式: log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_loc ...

  4. Nginx日志切割之Logrotate篇

    不管是什么日志文件,都是会越来越大的,大到一定程度就是个可怕的事情了,所以要及早的做处理,方法之一就是按时间段来存储,不过linux系统提供了Logrotate的日志管理工具,很好用,不用写计划任务脚 ...

  5. nginx日志切割总结

    Nginx日志切割   方法1(脚本+定时执行): #step1:加脚本 cut_nginx_log.sh,主进程把USR1信号发给worker,worker接到这个信号后,会重新打开日志文件 #!/ ...

  6. Linux centosVMware Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间

    一.Nginx访问日志 vim /usr/local/nginx/conf/nginx.conf //搜索log_format  日至格式 改为davery格式 $remote_addr  客户端IP ...

  7. Nginx笔记总结十:Nginx日志切割

    1.Nginx日志切割 logrotate日志文件管理工具,通过cron程序定期执行,默认在cron默认程序的dayli目录下 [root@joker logrotate.d]# cat /etc/c ...

  8. nginx日志、nginx日志切割、静态文件不记录日志和过期时间

    2019独角兽企业重金招聘Python工程师标准>>> 12.10 Nginx访问日志 日志格式 vim /usr/local/nginx/conf/nginx.conf //搜索l ...

  9. Nginx访问日志.Nginx日志切割

    11月27日任务 12.10 Nginx访问日志12.11 Nginx日志切割12.12 静态文件不记录日志和过期时间 1.Nginx访问日志 示例一: 日志格式 vim /usr/local/ngi ...

随机推荐

  1. week3 团队博客作业

    团队自我介绍地址: http://www.cnblogs.com/liuliudashun/p/5919555.html

  2. TP3.2加载外部PHPexcel类,实现导入和导出

    TP3.2加载外部PHPexcel类,实现导入和导出 导入: 1.将下载好的PHPexcel文件放到libray/Org/Uti/文件夹下,将PHPEXCEL.PHP改为PHPEXCEL.class. ...

  3. Spring之使用表达式配置切入点

    使用表达式配置切入点

  4. 【Vue学习笔记1】全局配置 Vue.config

    1.slient 类型:boolean: 默认:false: 用法:Vue.config.silent = true  用于取消 Vue 所有的日志与警告

  5. 【BOM】浏览器对象模型

    1.navigator :保存浏览器配置信息的对象 常用 navigator.plugins: 显示浏览器中所有插件信息的集合 navigator.cookieEnabled: 判断是否开启cooki ...

  6. TCP协议 连接三次握手

    TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...

  7. hdu 1540 Tunnel Warfare (线段树 区间合并)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  8. MT【103】二阶递推找规律

    评:如果直接找$a_n$的二阶递推式:$a_{n+2}-2\sqrt{2}a_{n+1}-a_n=0$有根号,不利于估计尾数.

  9. NOI2018旅游记

    这居然是我第一次参加非NOIP的NOI系列赛事,有点小期待啊 前几天的UNR我暴露出了许多问题,而且翻了好多分,不过令人震惊的是假设Day1不停电(导致已经写好的T3没交上去)我居然有rk10,虽然并 ...

  10. bzoj2456 mode (思路)

    不能把数存下来. 于是来打擂台,如果新数和他不相等,cnt--,否则cnt++.如果cnt<=0了,那个新数就来把它顶掉,然后把cnt重置成1 最后在台上的就是那个次数大于N/2的众数 (连&l ...