目录
1、在redis.conf配置文件找到logfile,并添加日志文件存储路径
2)方式二(备份日志但原日志文件不删除只清空当前日志内容,释放空间)
一、概述
在默认情况,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”