写一个shell脚本,保留web程序三天的日志,其他均删除
时间: 2023-11-28 19:47:50 浏览: 66
以下是一个简单的Shell脚本,用于保留Web程序三天的日志并删除其他日志:
```bash
#!/bin/bash
# 设置日志目录
LOG_DIR="/var/log/web"
# 计算3天前的日期
THREE_DAYS_AGO=$(date --date="3 days ago" +"%Y-%m-%d")
# 删除3天前的日志
find $LOG_DIR -type f -name "*.log*" -mtime +3 -exec rm {} \;
# 保留3天内的日志
find $LOG_DIR -type f -name "*.log*" ! -newermt "$THREE_DAYS_AGO" -exec echo "Keep log: {}" \;
```
首先,脚本定义了日志目录的变量LOG_DIR。然后,它使用date命令计算3天前的日期,并将其存储在变量THREE_DAYS_AGO中。
接下来,脚本使用find命令查找所有.log文件,只保留3天内的文件,同时删除3天前的文件。
最后,脚本使用find命令列出保留的日志文件。
请注意,该脚本仅适用于.log文件,如果您的日志文件扩展名不同,请相应更改命令中的文件类型。
相关问题
shell脚本,保留多个web程序三天的日志,其他均删除
可以使用以下脚本实现:
```bash
#!/bin/bash
# 定义日志文件目录
LOG_DIR="/var/log"
# 定义需要保留日志的web程序名称
WEB_PROGRAMS=("program1" "program2" "program3")
# 获取当前时间三天前的时间戳
THREE_DAYS_AGO=$(date -d "3 days ago" "+%s")
# 遍历日志目录下的所有文件
for file in "$LOG_DIR"/*
do
# 判断文件是否为普通文件
if [ -f "$file" ]
then
# 获取文件最后修改时间
LAST_MODIFIED=$(stat -c %Y "$file")
# 获取文件名
FILE_NAME=$(basename "$file")
# 判断文件名是否包含需要保留日志的web程序名称,并且最后修改时间是否在三天前
if [[ "${WEB_PROGRAMS[*]}" =~ "${FILE_NAME%%_*}" && "$LAST_MODIFIED" -lt "$THREE_DAYS_AGO" ]]
then
# 删除文件
rm "$file"
fi
fi
done
```
使用方法:
1. 把脚本保存为`clean_logs.sh`文件;
2. 修改`LOG_DIR`变量为你的日志文件目录;
3. 修改`WEB_PROGRAMS`变量为你需要保留日志的web程序名称;
4. 给脚本添加执行权限:`chmod +x clean_logs.sh`;
5. 使用定时任务(如cron)每天执行一次脚本:`0 0 * * * /path/to/clean_logs.sh`。
shell脚本,保留多个web程序三天的error、info、warn日志,其他均删除
可以使用 `find` 命令来进行文件查找和删除操作,结合 `-mtime` 参数可以指定查找和删除的时间范围。
假设日志文件都存放在 `/var/log/web` 目录下,且每个程序的日志文件名格式为 `program_name.log`,那么可以使用以下脚本来实现:
```shell
#!/bin/bash
LOG_DIR=/var/log/web
THRESHOLD_DAYS=3
for log_file in $LOG_DIR/*.log; do
# 获取文件名和程序名
file_name=$(basename $log_file)
program_name=${file_name%%.*}
# 保留指定级别的日志
for level in error info warn; do
find $LOG_DIR -name "$program_name.*.$level" -mtime -$THRESHOLD_DAYS -type f -exec echo "Keeping {}" \;
done
# 删除其它级别的日志
find $LOG_DIR -name "$program_name.*" ! -name "*.error" ! -name "*.info" ! -name "*.warn" -mtime +$THRESHOLD_DAYS -type f -delete -exec echo "Deleting {}" \;
done
```
这里使用了 `basename` 命令来获取日志文件名,然后使用 `${file_name%%.*}` 来获取程序名。接着使用 `find` 在目录中查找指定级别的日志,使用 `-mtime -$THRESHOLD_DAYS` 参数表示只保留三天内的日志,将找到的日志文件输出到控制台。然后再使用 `find` 删除其它级别的日志,使用 `! -name` 参数来排除指定的文件名,同时使用 `-mtime +$THRESHOLD_DAYS` 参数表示删除三天前的日志文件,将删除的日志文件输出到控制台。
注意,为了安全起见,建议在测试通过后再将 `-delete` 参数添加到 `find` 命令中来实际删除日志文件。
阅读全文