Redis日志按天切割并压缩存储本地磁盘及日志备份文件定时清理

目录

一、概述

二、需求

三、具体操作

1、在redis.conf配置文件找到logfile,并添加日志文件存储路径

2、编写自动切割日志脚本

1)方式一(备份日志同时删除原日志文件方式)

 2)方式二(备份日志但原日志文件不删除只清空当前日志内容,释放空间)

3、编写清理备份日志脚本

1)方式一(删除文件夹方式)

1)方式二(删除文件方式)

4、配置定时任务

5、取消定时任务

四、日志备份及清理各脚本文件下载


一、概述

在默认情况,redis是不会自动生成日志文件的,因为在redis.conf中默认logfile为""即不生成日志文件,所以对于有需要存储redis日志的,需要自己在redis.con文件中手动配置日志存储路径即配置logfile字段值。

二、需求

需要生成redis日志同时对redis日志按天存储本地磁盘,每天归档上一天日志并对备份日志进行压缩存储,redis不重启不阻塞。

三、具体操作

1、在redis.conf配置文件找到logfile,并添加日志文件存储路径

vi /data/redis-6.2.7/redis.conf

2、编写自动切割日志脚本

1)方式一(备份日志同时删除原日志文件方式)

创建日志备份脚本

touch /data/redis_split_logs.sh-------------------创建日志备份脚本             

chmod a+x /data/redis_split_logs.sh------------执行权限赋予

vi /data/redis_split_logs.sh-------------------------增加脚本内容如下

备份格式:/data/logs/redislogsback/20220610/20220610.tar.gz

备份日志保存格式一脚本如下:

#!/bin/bash
# 备份redis的日志

# 昨天的日期
file_date=$(date -d"1 day ago" +"%Y%m%d")
echo ${file_date}

#redis log的路径
log_path_redis=/data/redis-6.2.7/logs

# ===================backup dir name========================

back_base=/data/logs/redislogsback
date_year=$(date -d"1 day ago" +"%Y")
date_month=$(date -d"1 day ago" +"%m")
date_day=$(date -d"1 day ago" +"%d")
back_path=${back_base}/${date_year}${date_month}${date_day}
echo ${back_path}

# ===================mkdir back_path========================

if [ -d ${back_path} ];then
        echo 目录已经存在,不能重复创建
else
        mkdir -p ${back_path}
fi

# =================== 备份redis log ========================

cd ${log_path_redis}
for file in $(ls *log);
do
    mv ${file} ${back_path}/${file}_${file_date}
done

# =================== 备份日志压缩 ========================

cd ${back_path}
tar -zcvf ${file_date}.tar.gz ./*.log_${file_date}
rm -f *.log_${file_date}

 备份格式:/data/logs/redislogsback/20220610.tar.gz

备份日志保存格式二脚本如下:

#!/bin/bash
# 备份redis的日志

# 昨天的日期
file_date=$(date -d"1 day ago" +"%Y%m%d")
echo ${file_date}

#redis log的路径
log_path_redis=/data/redis-6.2.7/logs

# ===================backup dir name========================

back_base=/data/logs/redislogsback
echo ${back_base}

# ===================mkdir back_base========================

if [ ! -d ${back_base} ];then
        mkdir -p ${back_base}
fi

# =================== 备份redis log ========================

cd ${log_path_redis}
for file in $(ls *log);
do
    mv ${file} ${back_base}/${file}_${file_date}
done

# =================== 备份日志压缩 ========================

cd ${back_base}
tar -zcvf ${file_date}.tar.gz ./*.log_${file_date}
rm -f *.log_${file_date}

 2)方式二(备份日志但原日志文件不删除只清空当前日志内容,释放空间)

创建日志备份脚本

touch /data/redis_split_logs.sh-------------------创建日志备份脚本             

chmod a+x /data/redis_split_logs.sh------------执行权限赋予

vi /data/redis_split_logs.sh-------------------------增加脚本内容如下

备份格式:/data/logs/redislogsback/20220610.tar.gz

备份日志脚本如下:

#!/bin/sh
# 备份redis的日志

# 昨天的日期
file_date=$(date -d"1 day ago" +"%Y%m%d")
echo ${file_date}
#redis log的路径
log_path_redis=/data/redis-6.2.7/logs

# ===================backup dir name========================

back_base=/data/logs/redislogsback
echo ${back_base}

# ===================mkdir back_base========================

if [ ! -d ${back_base} ];then
        mkdir -p ${back_base}
fi

# =================== 备份redis log ========================

cd ${log_path_redis}
for file in $(ls *log);
do
    # 日志备份
    cp ${file} ${back_base}/${file}_${file_date}
    # 清空当前 日志,释放空间
    cat /dev/null > ${file}
done

# =================== 备份日志压缩 ========================

cd ${back_base}
tar -zcvf ${file_date}.tar.gz ./*.log_${file_date}
rm -f *.log_${file_date}

3、编写清理备份日志脚本

1)方式一(删除文件夹方式)

  • 使用find命令方式

   创建日志备份清理脚本

touch /data/find_delete_folder.sh-------------------创建日志备份脚本             

chmod a+x /data/find_delete_folder.sh------------执行权限赋予

vi /data/find_delete_folder.sh-------------------------增加脚本内容如下

    备份日志清理脚本如下:

#!/bin/sh
# 日志备份路径
back_base=/data/logs/data/logs/redislogsback
echo ${back_base}
#删除文件夹
find $back_base -type d -mtime +15 -exec rm -rf {} \;

参数解释:

$back_base --设置查找的备份日志目录;
-mtime +15 --设置修改时间为15天前;
-type d       --设置查找的类型为文件;其中f为文件,d则为文件夹
-exec rm -rf --查找
 {} \; --固定写法

  • 非find命令方式

创建日志备份清理脚本

touch /data/delete_redis_folder.sh-------------------创建日志备份脚本             

chmod a+x /data/delete_redis_folder.sh------------执行权限赋予

vi /data/delete_redis_folder.sh-------------------------增加脚本内容如下

    备份日志清理脚本如下:

#!/bin/sh
function deletedir(){
    ago_file=$(date -d '3 days ago' +%Y%m%d)
        dir_or_file=$1
        if [ -d $dir_or_file ]
        then
#            for element_date in `ls $dir_or_file`
            for element_date in $(ls $dir_or_file)
            do
                dir_or_file_date=$dir_or_file"/"$element_date
                if [ -d $dir_or_file_date ]
                then
                        date_file=$(date -d $element_date +%Y%m%d)
                        if [ $date_file -lt $ago_file ]
                        then
                                rm -rf $dir_or_file_date
                        fi
                fi
            done
        fi
}
# 日志备份路径
redislogsbackup="/data/logs/redislogsback"
deletedir $redislogsbackup

1)方式二(删除文件方式)

  • 使用find命令方式
  •    创建日志备份清理脚本

    touch /data/find_delete_logs.sh-------------------创建日志备份脚本             

    chmod a+x /data/find_delete_logs.sh------------执行权限赋予

    vi /data/find_delete_logs.sh-------------------------增加脚本内容如下

        备份日志清理脚本如下:

#!/bin/sh
# 日志备份路径
back_base=/data/logs/redislogsback
echo ${back_base}
# 删除/data/logs/redislogsback目录下所有文件
find $back_base -name -type f "*" -mtime +30 -exec rm -rf {} \;
# 删除/data/logs/redislogsback目录下.tar.gz后缀所有文件
# find $back_base -name -type f "*.tar.gz" -mtime +30 -exec rm -rf {} \;

参数解释:

$back_base --设置查找的备份日志目录;
-mtime +15 --设置修改时间为15天前;
-type d       --设置查找的类型为文件;其中f为文件,d则为文件夹
-name "*" --设置文件名称,可以使用通配符;
-exec rm -rf --查找
 {} \; --固定写法

  • 非find命令方式
  • 创建日志备份清理脚本

    touch /data/delete_redis_logs.sh-------------------创建日志备份脚本             

    chmod a+x /data/delete_redis_logs.sh------------执行权限赋予

    vi /data/delete_redis_logs.sh-------------------------增加脚本内容如下

        备份日志清理脚本如下:

#!/bin/sh
function deletedir(){
    ago_file=$(date -d '3 days ago' +%Y%m%d)
        dir_or_file=$1
        echo ${dir_or_file}
        if [ -d $dir_or_file ];then
        	  cd $dir_or_file
#            for element_date in `ls $dir_or_file`
            for file in $(ls *.tar.gz);do
                echo ${file}
                dir_ago_file_date=${file}
                if [ -f $dir_ago_file_date ];then
                   echo ${dir_ago_file_date}
#                  截取最后一个.前数据
                   dir_or_file_date=${dir_ago_file_date%.*}
                   ago_file_date=${dir_or_file_date%.*}
                   echo ${ago_file_date}
                   date_file=$(date -d $ago_file_date +%Y%m%d)
                   if [ $date_file -lt $ago_file ]
                   then
                           rm -f $file
                   fi
                fi
            done
        fi
}
# 日志备份路径
redislogsbackup="/data/logs/redislogsback"
deletedir $redislogsbackup

4、配置定时任务

1)创建定时任务-crontab:

语法
crontab(选项)(参数)

crontab 常用命令
-e #编辑该用户定时任务
-l #查看该用户定时任务
-r #删除该用户定时任务
-u<用户名称> #指定其他用户

在定时任务中添加执行该脚本(备份脚本和清理脚本)

crontab -e  -----添加定时

这里的设置是每天凌晨0点10分执行redis_split_logs.sh文件进行日志备份任务了,并且不输出任何执行信息。

10 0 * * * /data/redis_split_logs.sh >/dev/null 2>&1

这里的设置是每天凌晨0点30分执行delete_redis_logs.sh文件进行备份日志清理任务了,并且不输出任何执行信息。

30 0 * * * /data/delete_redis_logs.sh >/dev/null 2>&1

参数解析:

*号解释:
第一个*号表示时间中的 分钟  取值范围:0-59;
第二个*号表示时间中的 小时  取值范围:0-23;
第三个*号表示一个月中的第几天,取值范围:1-31;
第四个*号表示一年中的第几个月,取值范围:1-12;
第五个*号表示一个星期中的第几天,以星期天开始依次的取值为0~7,0、7都表示星期天;

参数
/data/delete_redis_logs.sh  表示执行脚本文件路径。
> /dev/null 2>&1  表示不输出任何日志信息。

扩展一下:

  • > /dev/null 2>&1 , 2>&1  > /dev/null    解释

标准输入0    从键盘获得输入即: /proc/self/fd/0 ;
标准输出1    输出到屏幕(即控制台) 即:/proc/self/fd/1 ;
错误输出2    输出到屏幕(即控制台)即:/proc/self/fd/2;

a)> /dev/null 2>&1 含义如下:

        > /dev/null 相当于 1> /dev/null,就是将标准输出,重定向到 /dev/null ,/dev/null 表示Linux的空设备文件 ,写到里面,就找不着,等于没写,不用挣扎了,真的找不到的。

         2>&1  就是重定向绑定,&是用来连接的,就是绳子,将两个输出(标准输出、错误输出)绑定到一块,一根绳儿上的蚂蚱。这样一来,错误输出,嘿嘿,你也找不到,不需要错误输出。

b)2>&1  > /dev/null 含义如下:

        在执行shell命令之前,默认会确定好输出位置,并从左往右执行重定向命令,所以对于这个来说,错误输出,仍是会输出到屏幕,不会丢弃。

  • >a.log 2>&1  , 2>&1 >a.log    解释

a)>a.log 2>&1 含义如下:

本来1----->屏幕 (1指向屏幕)。
执行>log后, 1----->log (1指向log)。
执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)。

b)2>&1 >a.log 含义如下:

本来1----->屏幕 (1指向屏幕)。
执行2>&1后, 2----->1 (2指向1,而1指向屏幕,因此2也指向了屏幕)。
执行>log后, 1----->log (1指向log,2还是指向屏幕)。

c)>a.log 2>&1 ,>>a.log 2>&1 区别

>a.log 2>&1( 会清空原有文件的内容,主要用法是: 命令 > 文件 2>&1)。

>>a.log 2>&1(追加到原有文件内容后面,主要用法是:命令 >> 文件 2>&1)。

d)>a.log 2>&1 ,>log 2>&1 & 区别

>log 2>&1 &(最后一个&表示把条命令放到后台执行),>a.log 2>&1 则不会。

2)查看定时任务是否写入成功

crontab -l | grep redis

5、取消定时任务

crontab -r 表示删除用户下的所有定时任务,当执行此命令后,所有用户下面的定时任务会被删除,执行crontab -l后会提示用户:“no crontab for admin”

四、日志备份及清理各脚本文件下载

各脚本文件下载

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值