JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

懒人专用2:利用自动脚本切割备份不断增长的日志

wys521 2024-10-03 03:41:15 精选教程 37 ℃ 0 评论

本期跟运维有关

与上一篇<懒人专用:利用自动脚本清理不断增长的多余日志>暴力清除日志不同, 这篇的重点是切割和备份

技术类型: Linux指令

应用平台: Centos

使用范围: 命令行/脚本

用到工具: cron / vi / logrotate

知识要点: 日志切割与备份

logrotate程序是一个Linux系统自带的日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。

再结合我们的远程备份转移等手段, 就能起到节省生产服务器空间的效果

先上使用前后的效果对比


logrotate的配置文件和目录默认位置

/etc/logrotate.conf
/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动读入/etc/logrotate.conf中执行。

我们以Nginx日志为例, 一步步实现日志的切割/转储/备份转移

第1步: 切割

先创建一个Nginx专用的配置文件

vi /etc/logrotate.d/nginx

我的Nginx日志假设是放在/data2/logs/里, 且都是nginx****.log(多个)这样的命名

辣么配置文件内容是这样的(实际使用时要把中文说明删除喔)

/data2/logs/nginx*.log {  nginx日志路径
        daily           每天轮询
        compress       通过gzip 压缩转储以后的日志 
        rotate 60    保留60天
        missingok   如果日志丢失,不报错继续滚动下一个日志
        notifempty  当日志为空时不进行滚动
        dateext        在文件末尾添加当前日期
        sharedscripts 运行postrotate脚本
        postrotate   脚本内容,给nginx发信号要求重新生成日志,如果nginx没有启动就不操作
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

可以先用-d参数验证一下配置是否正确

如果配置参数有误, 比如我们把上面的daily故意写成xdaily, 验证会显示类似这样的报错

配置无误后, 加入定时任务, 每晚12点执行

0 0 * * *       /usr/sbin/logrotate -f /etc/logrotate.d/nginx

当任务成功执行时, 日志分割的规律是:被分割出来的日志会生成新的日志文件, 原日志文件将全清空; 而新日志文件命名是在原文件名基础上在后面加上"-YYYYMMDD.gz"的日期

比如原日志文件名是: nginx.log

生成的切割文件名将会是: nginx.log-20210728.gz


第2步: 转储

为了测试整个过程可靠, 我们不等定时任务执行, 先手工测试执行一次

logrotate -f /etc/logrotate.d/nginx

得到这样的结果

可以看到, 符合条件的日志文件已经被切割/压缩成了新的文件(红色部分), 而原文件则被清空

为了后续的操作安全和方便, 我们把它们转移到另一个目录(可以先手工创建好/data2/logs/bak), 等待备份转移

整个专用的脚本文件

vi bak-logs.sh

脚本内容

#!/bin/bash
mv /data2/logs/*.gz /data2/logs/bak/

授权并执行

chmod +x bak-logs.sh
./bak-logs.sh

测试成功, 把这个转储脚本(自行加入你自己的脚本路径)也放入定时任务, 安排在切割任务的后面

0 1 * * *       bak-logs.sh

第3步: 备份转移

备份的目标是为了让生产服务器(我们先称它为A)上日志占用的空间节省出来

那为了备份, 我们可以在本地准备一台同样是Linux的服务器(称为B), 用来存储服务器的备份文件

为了让这个任务能定时自动执行, 无须人工干预, 我们需要让服务器A信任服务器B, 这样B就可以绕过账号密码的验证过程, 直接执行备份和转移(清除A服务器上的日志文件)任务

大概是这么个过程

鉴权是2个服务器间的密钥交换过程, 本文不作赘述

我们这里假设A已经信任B

所以在B上我们准备这样的脚本autobak.sh

#!/bin/bash
#下载服务器的切割的日志文件
scp  root@www.xxx.com:/data2/logs/bak/* /data/logs/
#移除服务器的切割的日志文件
ssh  root@www.xxx.com "rm -rf /data2/logs/bak/*"

也把它放到B的定时任务里

0 3 * * *       autobak.sh

这样就完成了

既然节省了服务器A的空间占用情况

又保留了全部的日志

举一反三, 同样的可以把数据库等日志也配置起来, 全面接管日益增长的日志吧


这期就酱,下期再见[哈欠]

复杂的问题简单化

每次只关注一个知识点

对技术有兴趣的小伙伴可以关注我, 我经常分享各种奇奇怪怪的技术知识

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表