前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >日志清理脚本

日志清理脚本

作者头像
叨叨软件测试
发布于 2020-06-16 06:39:34
发布于 2020-06-16 06:39:34
1.5K00
代码可运行
举报
文章被收录于专栏:叨叨软件测试叨叨软件测试
运行总次数:0
代码可运行

需求背景

解决某些中间件或者应用日志无法自动清理的情况,比如:Nacos 的 access 日志。

变更记录

  • Version 0.0.1 2020/06/05
    • 删除 N 天前的日志文件,仅删除匹配 ".log" 的日志文件

选项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sh clear-logs.sh [options] <value> ...

    -p<value>                            删除日志的路径,必输参数
    -d<value>                            删除 N 天前的日志文件,即保留 N 天日志,默认:7
    --help                               帮助信息
    -v, --version                        版本信息

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 清理 7 天前的日志文件
sh clear-logs.sh -p /home/nacos/logs
sh clear-logs.sh -p /home/nacos/logs -d 7

2. 清理 30 天前的日志文件
sh clear-logs.sh -p /home/nacos/logs -d 30

使用场景

Nacos access 日志清理

crontab 定时任务设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ crontab -e
0 1 * * * sh /home/nacos/clear-logs.sh -p /home/nacos/nacos/logs -d 7

clear-logs 日志文件,其中 ERROR 关键字会红色显示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cat /tmp/nacos-clear-logs/clear-logs.sh-202006.log
2020-06-07 01:00:01 [ INFO] ====>> Start cleaning up log files: [/home/nacos/nacos/logs]
2020-06-07 01:00:01 [ INFO] -- Clean up log file: [/home/nacos/nacos/logs/access_log.2020-04-02.log]
2020-06-07 01:00:01 [ INFO] ====>> End cleaning up log files: [/home/nacos/nacos/logs]
2020-06-08 01:00:01 [ INFO] ====>> Start cleaning up log files: [/home/nacos/nacos/logs]
2020-06-08 01:00:01 [ERROR] In the [/home/nacos/nacos/logs] directory, the log [7] days ago was not found!
2020-06-08 01:00:01 [ INFO] ====>> End cleaning up log files: [/home/nacos/nacos/logs]

脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat clear-logs.sh
#!/bin/bash
#================================================================
# HEADER
#================================================================
#    Filename         clear-logs.sh
#    Revision         0.0.1
#    Date             2020/06/05
#    Author           jiangliheng
#    Email            jiang_liheng@163.com
#    Website          https://jiangliheng.github.io/
#    Description      删除 N 天前的日志文件
#    Copyright        Copyright (c) jiangliheng
#    License          GNU General Public License
#
#================================================================
#
#  Version 0.0.1 2020/06/05
#     删除 N 天前的日志文件,仅删除匹配  "*.log*"  的日志文件
#
#================================================================
#%名称(NAME)
#%       ${SCRIPT_NAME} - 删除 N 天前的日志文件
#%
#%概要(SYNOPSIS)
#%       sh ${SCRIPT_NAME} [options] <value> ...
#%
#%描述(DESCRIPTION)
#%       删除 N 天前的日志文件,仅删除匹配  "*.log*"  的日志文件
#%
#%选项(OPTIONS)
#%       -p <value>                 删除日志的路径,必输参数
#%       -d <value>                 删除 N 天前的日志文件,即保留 N 天日志,默认:7
#%       --help                     帮助信息
#%       -v, --version              版本信息
#%
#%示例(EXAMPLES)
#%
#%       1. 清理 7 天前的日志文件
#%       sh ${SCRIPT_NAME} -p /home/nacos/logs
#%       sh ${SCRIPT_NAME} -p /home/nacos/logs -d 7
#%
#%       2. 清理 30 天前的日志文件
#%       sh ${SCRIPT_NAME} -p /home/nacos/logs -d 30
#%
#================================================================
# END_OF_HEADER
#================================================================

# header 总行数
SCRIPT_HEADSIZE=$(head -200 "${0}" |grep -n "^# END_OF_HEADER" | cut -f1 -d:)
# 脚本名称
SCRIPT_NAME="$(basename "${0}")"
# 版本
VERSION="0.0.1"

# 默认保留 7DAYS=7
# 脚本执行日志目录
CLEAR_LOGS_LOG_PATH=/tmp/$(whoami)-clear-logs
# 日志文件
LOGFILE=${CLEAR_LOGS_LOG_PATH}/${SCRIPT_NAME}-$(date +%Y%m).log

# usage
function usage() {
  head -"${SCRIPT_HEADSIZE:-99}" "${0}" \
  | grep -e "^#%" \
  | sed -e "s/^#%//g" -e "s/\${SCRIPT_NAME}/${SCRIPT_NAME}/g" -e "s/\${VERSION}/${VERSION}/g"
}

# 初始化创建脚本日志目录
function init() {
  # 目录不存在,则创建
  if [ ! -d "${CLEAR_LOGS_LOG_PATH}" ]
  then
    mkdir -p "${CLEAR_LOGS_LOG_PATH}"
  fi

  # 日志文件不存在,则创建
  if [ ! -f "${LOGFILE}" ]
  then
    touch "${LOGFILE}"
  fi
}

# 记录 INFO log
function infoLog() {
  echo "$(date "+%Y-%m-%d %H:%M:%S") [ INFO] ${1}" >> "${LOGFILE}"
}

# 记录 ERROR log
function errorLog() {
  echo -e "$(date "+%Y-%m-%d %H:%M:%S") \033[31m[ERROR]\033[0m ${1}" >> "${LOGFILE}"
}

# 清理 log
function clearLogs() {
  infoLog "====>> Start cleaning up log files: [${LOGS_PATH}]"
  cd "${LOGS_PATH}" || exit

  # 查询要清理的文件(*.log*)
  clear_log_files=$(find "${LOGS_PATH}" -type f -mtime +${DAYS} -name "*.log*")

  # 没有找到匹配文件,记录日志退出
  if [ -z "${clear_log_files}" ]
  then
    errorLog "In the [${LOGS_PATH}] directory, the log [${DAYS}] days ago was not found!"
    infoLog "====>> End cleaning up log files: [${LOGS_PATH}]"
    exit 1
  fi

  # 临时记录要清理的文件(*.log*)
  echo "${clear_log_files}" > log_files.tmp

  # 循环清理日志文件
  while IFS= read -r item
  do
    rm -f ${item}
    infoLog "-- Clean up log file: [${item}]"
  done < log_files.tmp

  # 删除临时文件
  rm log_files.tmp

  infoLog "====>> End cleaning up log files: [${LOGS_PATH}]"
}

# 主方法
function main() {
  init

  # 参数必输校验
  if [ -z "${LOGS_PATH}" ]
  then
    printf "Parameter [-p] is required!\n"
    exit 1
  fi

  # 目录合法性校验
  if [ ! -d "${LOGS_PATH}" ]
  then
   printf "[%s] is not a directory!\n" "${LOGS_PATH}"
   exit 1
  fi

  # 数字合法性校验,且必须大于 0,即至少保留1if ! [ "${DAYS}" -gt 0 ] 2>/dev/null
  then
    printf "Parameter [-d] must be a number greater than 0!\n"
    exit 1
  fi

  clearLogs
}

# 判断参数个数
if [ $# -eq 0 ];
then
  usage
  exit 1
fi

# getopt 命令行参数
if ! ARGS=$(getopt -o vd:p: --long help,version -n "${SCRIPT_NAME}" -- "$@")
then
  # 无效选项,则退出
  exit 1
fi

# 命令行参数格式化
eval set -- "${ARGS}"

while [ -n "$1" ]
do
  case "$1" in
    -p)
      LOGS_PATH=$2
      shift 2
      ;;

    -d)
      DAYS=$2
      shift 2
      ;;

    -v|--version)
      printf "%s version %s\n" "${SCRIPT_NAME}" "${VERSION}"
      exit 1
      ;;

    --help)
      usage
      exit 1
      ;;

    --)
      shift
      break
      ;;

    *)
      printf "%s is not an option!" "$1"
      exit 1
      ;;

  esac
done

main
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叨叨软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
日志清理脚本-V0.0.3(增加多目录清理、正则表达式匹配、调试模式;部分细节优化)
解决某些中间件或者应用日志无法自动清理的情况,比如:Nacos 的 access 日志清理,临时目录文件清理等。
叨叨软件测试
2020/07/31
4170
【AlmaLinux+Docker MySQL 实战】:自动化备份与恢复(备份策略·脚本编写·恢复演练)
作为 DBA,万一一场“你以为的备份”没有发生,就可能让业务在一秒内崩塌。怎样才能保证备份脚本一键跑起、有问题及时知晓、恢复流程随时可演练?这篇文章将从“备份策略”“脚本编写”到“恢复演练”三个知识节点,带你一步一步彻底搞定 MySQL 自动化备份与恢复。
IT咸鱼
2025/06/09
930
【AlmaLinux+Docker MySQL 实战】:自动化备份与恢复(备份策略·脚本编写·恢复演练)
awstats分析nginx日志「建议收藏」
看了awstats介绍后,感觉是个好东西,等装好来用的时候,不像那么一回事。awstats说白了就是对nginx,apache产生的日志进行分析。awstats分析出来的数据不准,日志是按照一定的规则来生成的,把访问数据存入到文件中,但是数据存入的时候可能是不全的,awstats分析的时候就有误差。
全栈程序员站长
2022/09/13
5960
awstats分析nginx日志「建议收藏」
运维中的日志切割操作梳理(Logrotate/python/shell脚本实现)
对于Linux系统安全来说,日志文件是极其重要的工具。不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过!logrotate程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。可以节省磁盘空间。下面就对logrotate日志轮转操作做一梳理记录: 1)配置文件介绍 Linux系统默认安
洗尽了浮华
2018/01/23
4.2K0
Tomcat日志配置与清理
今天看了下tomcat日志,发现已经有8g多了...  仔细想想大概有2年多没有处理过日志了。因为博客线上也没出过啥问题,所以压根就没怎么看过日志。毕竟不是运维 ... 这方面确实没咋注意,服务器还是有很多需要搞清楚的 。
sunonzj
2022/06/21
2.1K0
Tomcat日志配置与清理
Redis 日常运维脚本(增加集群批量删除 key 功能)
Redis 日常运维脚本 中的 redis-tools.sh 仅支持删除单个 key 和 全部清理,并未实现匹配特定前缀批量删除的功能。
叨叨软件测试
2020/05/18
3.5K0
Oracle-Listener log解读
在ORACLE数据库中,如果不对监听日志文件(listener.log)进行截断,那么监听日志文件(listener.log)会变得越来越大.
小小工匠
2021/08/16
2.2K0
日志定期清理和logrotate
常见应用服务,都会记录日志,方便问题查询和故障定位。linux系统本身也会有日志输出。
zero000
2019/04/29
8K0
日志定期清理和logrotate
Redis 日常运维脚本
需求背景 生产 Redis 日常运维需要。 前提 添加 Redis 可执行命令到系统环境变量中。 1$ cat redis-profile.sh 2export PATH=/usr/local/redis-5.0.7/src/:$PATH 3 4# 添加到系统环境变量 5$ cp redis-profile.sh /etc/profile.d/ 6 7# 实时生效 8$ source /etc/profile.d/redis-profile.sh 9 10# 验证 11$ redis-cl
叨叨软件测试
2020/05/07
1.3K0
群辉安装Transmission套件、增强汉化WebUI并备份做种列表
请注意,本文编写于 433 天前,最后修改于 433 天前,其中某些信息可能已经过时。
吴蛋蛋
2023/03/14
6.5K0
群辉安装Transmission套件、增强汉化WebUI并备份做种列表
nginx日志切割及7天前的历史日志删除脚本
上次写到《服务器日志备份超节省空间的思路》,压缩后磁盘占用由 93%降到了 62%,效果还是不错的!为什么不直接删除呢?其实是因为这些日志涉及到支付等重要业务,保存半年以上也算是保守的做法。 今早,又发现几例磁盘空间报警,占用率都在 90%+,关键居然是根分区!这要是日志突然暴涨,把根分区撑爆了,那就可以体验到“菊花一紧”的快感了吧? 索性利用 CRT 的全局命令把磁盘空间占用率超过 75%的服务器筛选出来,打算继续进行清理磁盘空间这个枯燥的工作。结果,发现好几台 nginx 方向代理服务器的日志居然还没做
张戈
2018/03/23
2.2K0
使用并发 ssh 连接来提升捞日志脚本执行效率
公司有个简单粗暴的日志服务,它部署在多台机器实例上,收集的日志记录在每台机器本地硬盘,写一个小时自动切换日志文件,硬盘空间写满了自动回卷,大约可以保存两三天的历史数据。为什么说它粗暴呢?原来它不提供任何查询日志的接口,想要获取日志唯一的办法就是直接查日志文件:
海海
2022/08/31
1.1K0
LINUX脚本使用实战,持续更新
结果测试 [root@zabbix shell]# sh checkurl.sh www.baidu.com www.baidu.com url [ 确定 ]
cuijianzhe
2022/06/14
2K0
LINUX脚本使用实战,持续更新
Docker 日志切割参考
===============================================
用户5760343
2019/11/05
2K0
Docker 日志切割参考
nginx 日志切割
1.nginx_log_rotate.sh文件 #nginx日志切割脚本 #author: joshau317 #!/bin/bash #1.设置日志文件存放目录,假设你的nginx的日志存在这个目录里 logs_path="/data/logs/nginx/" #2.设置pid文件,这个根据你自己的环境,找到nginx.pid所在目录 pid_path="/usr/local/nginx/logs/nginx.pid" #3.创建分割存储的日期文件目录 datetime=`date -d "yest
joshua317
2018/04/16
1.6K0
Nginx学习之定时切割日志
Nginx日志默认情况下写入到一个文件中,为了区分各个域下的日志,我们一般会分开存储。即时这样,文件也会变的越来越大,非常不方便查看分析。通常我们是以每日来做统计的,下面来聊聊以日期来分隔Nginx日志。
小柒2012
2018/11/29
5820
Nginx学习之定时切割日志
nginx每天自动切割日志脚本
nginx是现在应用比较广泛的轻量级web应用服务器,可做前端负载,也可以添加不同插件做应用服务器,比如直播 点播流媒体等
zhangdd
2018/08/01
5000
Linux下Nginx、MySQL和PHP等应用的日志切割脚本
在Linux中如果应用程序会产生日志,那么就需要考虑日志切割,例如按照固定的大小切割、按照日期进行切割等等。同样,在编译Nginx1.9.0、MySQL5.7.7rc和PHP7后,这三个应用服务都会产生日志,尤其是Nginx进程根据配置文件ngnix.conf记录每条访问记录到access.log中。如果所有的日志都打印到同一个文件中的话,那么时间长了的话就会影响效率。
typecodes
2024/03/29
1560
Linux下Nginx、MySQL和PHP等应用的日志切割脚本
推荐一款日志切割神器
点击上方蓝色“程序猿DD”,选择“设为星标” 回复“资源”获取独家整理的学习资料! 链接:https://urlify.cn/F3Uzmi 对于 Linux 系统安全来说,日志文件是极其重要的工具。不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分 Nginx日志之类的 CRON 脚本,大家似乎遗忘了 Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过! logrotate 程序是一个日志文件管理工具。用于分割日志文件,删除旧
程序猿DD
2023/04/17
1.3K0
推荐一款日志切割神器
生产环境日志清理脚本
生产上有40多个微服务部署的应用,每个应用都会产生日志,随着时间的增长,日志量不断增大,现需要清理。有两个重要的应用日志需保留90天,其它应用保留20天。
loong576
2020/07/20
1.2K0
推荐阅读
相关推荐
日志清理脚本-V0.0.3(增加多目录清理、正则表达式匹配、调试模式;部分细节优化)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验