Docker 日志切割参考

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保存。

[

复制代码

](javascript: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>

[

复制代码

](javascript: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日志切割。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据库干货铺

国产数据库部署初体验

达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。本次将进行DM8的开发版本的部署。

12140
来自专栏DevOps持续集成

06-Shell-局部与全局变量

8520
来自专栏BI8ESZ

docker 命令

docker build -t 镜像名 . (注意最后有个点用来表示当前目录,初次构建速度会比较慢,需要多等一会。)

10230
来自专栏MAC常见问题

如何在Mac上的软件更新中隐藏MacOS Catalina更新提示

有好多小伙伴不愿意升级到MacOS Catalina,但是电脑上有系统更新的红点,那么怎么去除呢,下面教大家如何在Mac上的软件更新中隐藏MacOS Catal...

18720
来自专栏运维之美

Linux 曝出严重安全漏洞,受限用户亦可提权至 Root 身份运行任意命令!(内附解决方案)

作为 Linux 中最常使用的重要实用程序之一,sudo 几乎安装在每一款 UNIX 和 Linux 发行版上的,以便用户调用和运行核心命令。

12820
来自专栏洛米唯熊

CVE-2019-14287: sudo 权限绕过漏洞

sudo,也就是以超级管理员身份运行(superuser do)的意思。sudo 是 Linux 中最常使用的重要实用程序之一,它功能十分强大,几乎安装...

14630
来自专栏Ms08067安全实验室

CVE-2019-14287:sudo 权限绕过漏洞(复现全过程)

这里表示 test 可以 任意主机上 任何用户 但这个用户不能属于root组 执行vim命令

11950
来自专栏DevOps持续集成

04-Shell-环境变量

[root@node1 ~]# echo $BASH_VERSION

8620
来自专栏DevOps持续集成

02-Shell-脚本多种执行方式

[root@node1 ~]# chmod o+x first.sh

10820
来自专栏微信公众号【Java技术江湖】

夯实Java基础系列16:一文读懂Java IO流和常见面试题

术语“输入”和“输出”有时候会有一点让人疑惑。一个应用程序的输入往往是另外一个应用程序的输出 那么OutputStream流到底是一个输出到目的地的流呢,还是...

10110

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励