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

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. 《Bandwidth-Aware Scheduling With SDN in Hadoop:A New Trend for Big Data》--2017

    Hadoop中使用SDN的带宽感知调度:大数据的一种新趋势 Abstract: 为了处理大规模的数据,提出了基于Hadoop框架的MapReduce,在Hadoop系统中,有一种叫做NP完全最小(NP ...

  2. TortoiseSVN 设置中文语言包

    相关 TortoiseSVN 下载与安装 [立即前往]下载 简体中文包 64 位 [一键下载] [百度云下载] [官网下载] 简体中文包 32 位 [一键下载] [官网下载]安装    版本确认    ...

  3. js保留两位小数方法总结

    js保留两位小数方法总结 最近在做结算系统,经常需要用到金额保留两位小数,刚开始我一直用的是Angular中的过滤器number |2,但是,这无法满足我的需求.问题是,当用户离开文本框时,我需要将用 ...

  4. MySQL 主从复制详解

    读写分离的意思是,写入的时候向 a 服务器写入,而读出的时候从 b c d 甚至更多的服务器读出:这样的架构适合于读多写少的应用,最典型的就是火车购票系统,一般我们买票的时候要先查询好多次,包括车次啊 ...

  5. spark性能调优(二) 彻底解密spark的Hash Shuffle

    装载:http://www.cnblogs.com/jcchoiling/p/6431969.html 引言 Spark HashShuffle 是它以前的版本,现在1.6x 版本默应是 Sort-B ...

  6. 解题:SCOI 2007 蜥蜴

    题面 拆点跑最大流 所有能跑出去的点连向汇点,容量为inf 原点连向所有初始有蜥蜴的点,容量为1 每根柱子拆成两个点“入口”和“出口”,入口向出口连容量为高度的边,出口向别的有高度的柱子的入口连容量为 ...

  7. C#列表所有IIS站点以及相关站点属性

    using System; using System.Drawing; using System.Collections; using System.ComponentModel; using Sys ...

  8. IntelliJ IDEA(2018)安装详解

    转: IntelliJ IDEA(2018)安装详解 置顶 2018年06月06日 22:58:45 Lazymanx 阅读数:95701   版权声明: https://blog.csdn.net/ ...

  9. Spring MVC测试框架

    原文链接:http://jinnianshilongnian.iteye.com/blog/2004660 Spring MVC测试框架详解——服务端测试 博客分类: springmvc杂谈 spri ...

  10. dedecms添加文章时提示标题为空,编辑文章时编辑器空白的解决办法

    dedecms添加文章时提示标题为空,编辑文章时编辑器空白的解决办法 dedecms出现这个问题与代码无关,主要是和PHP的版本有关,用的PHP5.4,更换成PHP5.2之后就不会有这个问题了. 问题 ...