首页 > 系统相关 >shell-应用日志清理脚本(通用)

shell-应用日志清理脚本(通用)

时间:2024-03-05 13:34:43浏览次数:29  
标签:shell LOGS SCRIPT 清理 #% PATH 日志 log

应用日志清理脚本(通用)

#!/bin/bash
#================================================================
# HEADER
#================================================================
#    Filename         clear-logs.sh
#    Revision         0.0.3
#    Date             2023/11/06
#
#================================================================
#%名称(NAME)
#%       ${SCRIPT_NAME} - 删除 N 天前的日志文件或者单文件size大于 M GB
#%
#%概要(SYNOPSIS)
#%       sh ${SCRIPT_NAME} [options] <value> ...
#%
#%描述(DESCRIPTION)
#%       删除 N 天前的日志文件 or 单文件size大于 M GB,仅删除匹配  "*.log*"  的日志文件
#%
#%选项(OPTIONS)
#%       -p <value>                 删除日志的路径,
#%       -d <value>                 删除 N 天前的日志文件,即保留 N 天日志,默认:7
#%       -s <value>                 删除单文件size大于 M 日志,默认:10G
#%       -u <value>                 删除磁盘大于u%,清理业务日志,默认:80
#%       --help                     帮助信息
#%       -v, --version              版本信息
#%
#%示例(EXAMPLES)
#%
#%       1. 清理 7 天前的日志文件,或者单文件size大于10GB
#%       sh ${SCRIPT_NAME} -p ${MARINES_HOME}/application/logs/
#%       sh ${SCRIPT_NAME} -p ${MARINES_HOME}/application/logs/ -d 7 -s 10G
#%
#%       2. 清理系统 30 天前的日志文件,或者单文件size大于20GB
#%       sh ${SCRIPT_NAME} -p /var/log/ -d 30 -s 20G
#%
#%       3. 清理 7 天前的日志文件,或者单文件size大于1GB,当删除磁盘大于50%,清理业务日志
#%       sh ${SCRIPT_NAME} -p ${MARINES_HOME}/application/logs/ -d 7 -s 1G -u 50
#%
#================================================================
# 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"

# 默认保留 7 天
DAYS=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}"
}

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

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

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

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

# 磁盘大于u%,清理业务日志
disk_usages() {
# 指定要检查的文件夹路径
folder_path="$1"
[ -z ${USAGE} ] &&  USAGE=80
# 获取挂载点`/`的磁盘使用率
disk_usage=$(df -h | grep "/$" | awk '{print $5}' | cut -d'%' -f1)

# 检查磁盘使用率是否超过u%
if [ $disk_usage -gt ${USAGE} ]; then
    errorLog "Disk usage is above ${USAGE}%. Deleting files in [${folder_path}]"

    # 删除指定文件夹中的文件
    find $folder_path -type f -mtime +1 -name "*.log*" -delete    
    warningLog "The day before Log Files deleted."
    disk_usage=$(df -h | grep "/$" | awk '{print $5}' | cut -d'%' -f1)
    if [ $disk_usage -gt ${USAGE} ]; then
      find $folder_path -type f -name "*.log*" -delete 
      warningLog "All Log Files deleted."
    fi
else
    infoLog "Disk usage is below ${USAGE}%. No action needed."
fi
}
# 清理 log
function clearLogs() {
  [ -z "${LOGS_PATH}" ] && LOGS_PATH=${marines_home}application/logs/

  startLog "====>> Start cleaning up log files: [${LOGS_PATH}]"
  cd "${LOGS_PATH}" || exit

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

  # 没有找到匹配过期文件,记录日志退出
  if [ -z "${clear_log_old_files}" ]
  then
    warningLog "In the [${LOGS_PATH}] directory, the log [${DAYS}] days ago was not found!"
  else
  infoLog "-- Clean up expire log file: [${clear_log_old_files}]"
  # 删除
  find "${LOGS_PATH}" -type f -mtime +${DAYS} -name "*.log*" -exec rm -rf {} \;
  fi

  # 没有找到匹配大文件,记录日志退出
  if [ -z "${clear_log_big_files}" ]
  then
    warningLog "In the [${LOGS_PATH}] directory, the log [${SIZES}] was not found!"
  else
  infoLog "-- Clean up big log file: [${clear_log_big_files}]"
  # 删除
  find "${LOGS_PATH}" -type f -size +${SIZES} -name "*.log*" -exec truncate -s 0 {} \;
  fi

  # 磁盘大于u%,清理业务日志
  disk_usages ${LOGS_PATH} 

  endLog "====>> 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,即至少保留1天
  if ! [ "${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:s:p:u: --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
      ;;
    -s)
      SIZES=$2
      shift 2
      ;;
    -u)
      USAGE=$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

 

标签:shell,LOGS,SCRIPT,清理,#%,PATH,日志,log
From: https://www.cnblogs.com/user-sunli/p/18053832

相关文章

  • 自已写的shell小程序: 查询删除lua+redis和conf配置的nginx黑名单
    #!/bin/bash#定义一些变量REDIS_HOST=192.168.10.38REDIS_PORT=6370REDIS_AUTH=123456NGINX_BLOCKIPCONF_PATH=/data/software/openresty/nginx/conf.d/block_ip.conf#接收需要查询的IP地址echo-e"查询被www.baiinfo.com屏蔽的IP地址,请输入精确的IP地址(支......
  • Shell 获取网卡名称及对应ip脚本
    以下是一个使用ifconfig获取网卡名及对应IP的简单Shell脚本:#!/bin/bashecho"网卡名和对应IP:">output.txt#使用ifconfig命令获取网卡信息,并使用awk进行处理ifconfig|awk'/^[a-zA-Z0-9]+/{interface=$1;next}/inet/{printinterface":"$2}'>>out......
  • 菜刀、冰蝎、蚁剑、哥斯拉Webshell流量特征
    1.冰蝎流量特征:Accept有自己专属的流量特征,查看content-Length长度。对上传参数base64进行解码,再代码末端再次解码。可看上传流量具体操作。再response也可查看揭秘参数后的流量 2.哥斯拉流量特征:content-Length:数据包长度达万个Cookie流量包后面存在分号;  3.菜刀......
  • shell工具连接linux时的报错问题
    问题描述在使用shell工具连接linux时报以下错误SSH!Agentauthselected,butnorunningagentisdetectedSSH!Agentauthselected,butnorunningagentisdetected解决方法方法1#首先使用ping方法查看是否在同一网段pingxxx.xxx.xx.x方法2#安装[openss......
  • powershell保护明文密码
    winrm脚本能运行了,就想着明文密码怎么也隐藏一下,网上搜了一圈,还是sparkdev的简单明了:https://www.cnblogs.com/sparkdev/p/7258507.html试着走一下,txt方式有效,高级的txt+key却报错“ConvertTo-SecureString:输入数据不是完整的块”,一时也不知怎么解决,只得记下日后反刍。$Pass......
  • PowerShell 命令来修改打印机属性中端口的配置 PowerShell 修改注册表中打印机属性端
    PowerShell命令来修改打印机属性中端口的配置,可以通过以下步骤来实现:首先,使用 Get-PrinterPort 命令获取当前打印机端口的信息,找到需要修改的端口名称。然后,使用 Set-PrinterPort 命令来修改端口的配置,去掉“启用了SNMP状态”选项前面的“√”。下面是一个示例代码,假设......
  • shell中> /dev/null 2 > &1
    linux在执行shell命令之前,就会确定好所有的输入输出位置,并且从左到右依次执行重定向的命令。command>/dev/null2>&11.>/dev/null这条命令的作用是将标准输出1重定向到/dev/null中。/dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。那......
  • PowerShell 中,您可以通过远程连接来管理其他计算机。以下是一些常见的用于管理远程主
    PowerShell中,您可以通过远程连接来管理其他计算机。以下是一些常见的用于管理远程主机的PowerShell命令:建立远程会话:powershellCopyCodeEnter-PSSession-ComputerName"RemoteComputerName"这个命令将在本地计算机和远程计算机之间建立一个交互式的PowerShell会话。......
  • PowerShell 中配置远程主机,您需要确保已经启用了远程管理功能,并且具有适当的权限。以
    PowerShell中配置远程主机,您需要确保已经启用了远程管理功能,并且具有适当的权限。以下是一些常见的远程主机配置步骤:启用远程管理:在远程主机上,您需要打开PowerShell并以管理员身份运行,然后运行以下命令来启用远程管理:powershellCopyCodeEnable-PSRemoting-Force这将启......
  • 本地主机上配置 PowerShell,您可以执行以下一些常见的配置步骤
    在本地主机上配置PowerShell,您可以执行以下一些常见的配置步骤:检查执行策略:在PowerShell中,执行策略用于控制脚本的执行。可以通过运行以下命令来检查当前的执行策略:powershellCopyCodeGet-ExecutionPolicy如果策略不是RemoteSigned或Unrestricted,您可以使用以下命令......