nginx 日志切割(也适用于docker)
===============================================
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级目录:存放切割后备份的日志文件
image
二、配置nginx容器的日志切割
2.1 编辑cutlogs.sh
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">mkdir -p /opt/sh vi /opt/sh/cutlogs.sh</pre>
将下面的内容添加到cutlogs.sh内,wq保存。
[
复制代码
]( :void(0); "复制代码")
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">#!/bin/bash
指定日志和切割后日志备份的目录
YEAR=
(date +%m) DAY=
(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/
((
LOGS_BAK_PATH/
((
LOGS_BAK_PATH/
{MONTH} fi # 创建目录 mkdir -p
{YESTERDAY}
复制当前的日志文件到备份的目录
cp
{LOGS_BAK_PATH}/
{YESTERDAY}.log cp
{LOGS_BAK_PATH}/
{YESTERDAY}.log cp
{LOGS_BAK_PATH}/
{YESTERDAY}.log # 清空日志
{LOGS_PATH}/admin_access.log > ${LOGS_PATH}/error.log</pre>
[
复制代码
]( :void(0); "复制代码")
2.2 给cutlogs.sh增加权限
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">chmod 777 /opt/sh/cutlogs.sh</pre>
PS.在创建定时任务之前,可以用下面的命令先试验脚本是否存在问题
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">bash /opt/cutlogs.sh</pre>
三、创建定时任务
3.1 编辑crontab
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">vi /etc/crontab</pre>
将下面的内容添加到crontab文件中,wq保存。
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># 每天0:00执行该脚本 0 0 * * * root bash /opt/sh/cutlogs.sh</pre>
3.2 重启crontab
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">systemctl restart crond</pre>
根据这个方案切割后的日志文件会根据这样的结构进行存放。
后话:
不停机做日志切割可能会出现日志记录丢失的情况(即拷贝走、清空源文件之间会有时间间隔),但是对于目前的业务,一天的日志信息量不大且丢失的日志对于整天的日志来说犹如沧海一粟,故现在先用这个方案来解决docker部署后的nginx日志切割。
继续阅读与本文标签相同的文章
mysql 常用配置及优化
-
CPU超分型专有宿主机(ddh.v5)上线
2026-05-22栏目: 教程
-
导致企业破产的DDOS,成本可能只需30元人民币
2026-05-22栏目: 教程
-
《阿里云前端技术周刊》第十五期
2026-05-22栏目: 教程
-
更简单易用的数据仓库,阿里云重磅推出分析型数据库3.0版
2026-05-22栏目: 教程
-
Kubernetes 弹性伸缩全场景解析(三) - HPA 实践手册
2026-05-22栏目: 教程
