nginx日志切割脚本

发布时间 2023-12-18 16:17:19作者: 做时间的好朋友
#!/bin/bash
# utf-8
# description: nginx滚动切割脚本,按照500M进行滚动切割
# ---------------------------------------------------------------------
log_directory="/export/servers/nginx/logs"     # 日志文件目录
max_size=500                                   # 日志文件的最大大小,单位为MB
log_array=("access.log" "error.log")           # 要操作的日志集合
pid_file="/export/servers/nginx/run/nginx.pid" # nginx的PID
# ---------------------------------------------------------------------
count=0

# 日志滚动归档
logrotate() {
  local log_file="$1"
  local log_path="${log_directory}/${log_file}"

  if [[ ! -f "$log_path" ]]; then
    return
  fi

  local current_size=$(stat -c %s "$log_path")

  # 判断当前日志文件大小是否超过最大大小
  if ((current_size > max_size * 1024 * 1024)); then
    local log_file_prefix="${log_file%.*}"
    # 创建一个新的日志文件名,格式为access_YYYYMMDD_HHMMSS.log
    local new_log_file="${log_file_prefix}.$(date +%Y%m%d_%H%M%S).log"
    # 重命名当前日志文件
    mv -f "$log_path" "${log_directory}/${new_log_file}"
    # 重新启动nginx,使其生成新的日志文件
    ((count++))
  fi
}

# 重新生成日志文件写入
generate_log_file() {
  if ((count > 0)); then
    /bin/kill -USR1 "$(cat "$pid_file")" 2>/dev/null
  fi
}

# 删除历史日志
delete_history_log() {
  find "$log_directory" -mtime +5 -type f -exec rm -f {} \;
}

# 主函数
main() {
  for log in "${log_array[@]}"; do
    logrotate "$log"
  done
  generate_log_file
  delete_history_log
}

main