Linux日志切割

1. 建立脚本文件

  1. mkdir -p /app/script/log_clean
  2. vi /app/script/log_clean/log_clean.sh

2. 脚本内容

  1. #!/bin/sh
  2. #日志压缩清理脚本,本脚本对指定目录文件进行压缩、清理,支持超过指定大小清理,超过指定日期清理。
  3. #========================自定义配置==============================
  4. #配置格式:定义log_conf数组,数组的第一个值为:日志目录;第二个为:匹配日志文件;第三个为:日志过期时间,操作过期时间则进行删除;第四个为:最大存储大小,超过则会进行删除;第五个为:不压缩最近几个日志,第六个为:是否进行切割,切割则填写c,否则填写f,第七个为:切割的文件名
  5. log_conf[0]=""/opt/lingmou/capture-server-exception/logs/" "*.zip.*" "7" 100 10" #表示清理/opt/lingmou/capture-server-exception/logs/目录下匹配为*.zip.*的日志文件,最长保留日期为7天,最大存储为100G,不压缩最近10个日志(方便查看)
  6. log_conf[1]=""/opt/nginx/logs/" "configcenter.private.access.log.202*" "7" 10 2 c "configcenter.private.access.log"" #表示清理opt/nginx/logs/目录下匹配为configcenter.private.access.log.202*的日志文件,最长保留日期为7天,最大存储10G,不压缩最近2个日志,进行切割日志,切割的日志文件为configcenter.private.access.log
  7. script_log="log.log" #[必填]当前脚本日志存储路径,默认为当前目录的log.log文件
  8. #========================程序====================================
  9. cd $(cd `dirname $0`; pwd) #切换到脚本运行目录
  10. log_clean_check="$1"
  11. log_name="清理日志" #填写日志脚本名称,以方便能在日志文件里面快速查找到
  12. run() {
  13. for log_conf_str in "${log_conf[@]}"; do
  14. log_conf_file_path=$(echo "${log_conf_str}" | awk '{print $1}')
  15. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 开始处理:${log_conf_str}" | tee -a ${script_log}
  16. if [[ -d $log_conf_file_path ]]; then
  17. log_conf_file_path_list=$(find ${log_conf_file_path} -maxdepth 0 -type d)
  18. while read line; do
  19. log_conf_str2=$(echo "${log_conf_str}" | awk '{$1="";print $0}')
  20. log_conf_str2=$(echo "${line}${log_conf_str2}")
  21. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 开始处理日志文件:${log_conf_str2}" | tee -a ${script_log}
  22. Start ${log_conf_str2}
  23. done <<<"$log_conf_file_path_list"
  24. else
  25. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 处理完成,目录:${log_conf_file_path} 不存在,不进行处理!" | tee -a ${script_log}
  26. fi
  27. done
  28. }
  29. #启动判断程序
  30. Start() {
  31. log_path="$1"
  32. log_key="$2"
  33. log_overdue="$3"
  34. log_max="$4"
  35. log_nogzip="$5"
  36. log_cutting="$6"
  37. log_cut="$7"
  38. #判断是否需要切割日志
  39. if [[ $log_cutting = "c" ]]; then
  40. if [[ -n $log_cut ]]; then
  41. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 切割日志启动" | tee -a ${script_log}
  42. cut_logs
  43. fi
  44. fi
  45. #启动过期日志判断
  46. if [[ -n $log_overdue && $log_overdue != "-1" ]]; then
  47. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 限制日期模式启动" | tee -a ${script_log}
  48. clean_overdue
  49. fi
  50. #判断是否需要压缩日志
  51. if [[ -n $log_nogzip && $log_nogzip != "-1" ]]; then
  52. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 压缩日志启动" | tee -a ${script_log}
  53. if [ ! -d $log_bak ]; then
  54. mkdir -p $log_bak
  55. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 创建备份目录:$log_bak" | tee -a ${script_log}
  56. fi
  57. gzip_logs
  58. fi
  59. #清除操作指定大小文件
  60. if [[ -n $log_max && $log_max != "-1" ]]; then
  61. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 限制文件大小模式启动" | tee -a ${script_log}
  62. clean_max
  63. fi
  64. }
  65. #切割日志
  66. cut_logs() {
  67. log_filepath="${log_path}${log_cut}"
  68. log_newpath="${log_filepath}.$(date -d "yesterday" +"%Y-%m-%d")"
  69. while :; do
  70. if [ ! -f $log_newpath ]; then
  71. break
  72. else
  73. i=$(expr $i + 1)
  74. log_newpath="${log_filepath}.$(date -d "yesterday" +"%Y-%m-%d").${i}"
  75. fi
  76. done
  77. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 将${log_filepath}复制为${log_newpath}"
  78. if [[ "${log_clean_check}t" != "tt" ]]; then
  79. if [[ -f ${log_filepath} ]]; then
  80. cp -fpb ${log_filepath} ${log_newpath}
  81. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 复制完成" | tee -a ${script_log}
  82. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 清空${log_filepath}日志" | tee -a ${script_log}
  83. : >${log_filepath}
  84. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 日志切割完成" | tee -a ${script_log}
  85. else
  86. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 文件${log_filepath}不存在不进行处理" | tee -a ${script_log}
  87. fi
  88. fi
  89. }
  90. #压缩日志
  91. gzip_logs() {
  92. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 压缩目录:$log_path 匹配文件:$log_key 不压缩个数:$log_nogzip" | tee -a ${script_log}
  93. filelist=$(find ${log_path} -name "${log_key}" | xargs ls -tr | grep ${log_path} | grep -v gz | tac | sed "1,${log_nogzip}d" | tac)
  94. for line in $filelist; do
  95. log_bak="${line%/*}/bak"
  96. if [[ ! -d $log_bak ]]; then
  97. mkdir -p $log_bak
  98. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 创建备份目录:$log_bak" | tee -a ${script_log}
  99. fi
  100. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 开始压缩$line" | tee -a ${script_log}
  101. if [[ "${log_clean_check}t" != "tt" ]]; then
  102. if [[ -f ${line} ]]; then
  103. gzip_size=$(gzip -9 $line)
  104. else
  105. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 文件${line}不存在不进行处理" | tee -a ${script_log}
  106. fi
  107. fi
  108. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 压缩完成$line" | tee -a ${script_log}
  109. line="${line}.gz"
  110. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 开始移动压缩文件$line" | tee -a ${script_log}
  111. if [[ "${log_clean_check}t" != "tt" ]]; then
  112. if [[ -f ${line} ]]; then
  113. mv $line $log_bak
  114. else
  115. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 文件${line}不存在不进行处理" | tee -a ${script_log}
  116. fi
  117. fi
  118. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 移动压缩文件完成$log_bak" | tee -a ${script_log}
  119. done
  120. }
  121. #清理:日期模式
  122. clean_overdue() {
  123. if [[ "${log_clean_check}t" != "tt" ]]; then
  124. logs=$(find ${log_path} -mtime +${log_overdue} -name "${log_key}" | xargs rm -f) #清理日志
  125. else
  126. logs=$(find ${log_path} -mtime +${log_overdue} -name "${log_key}") #清理日志
  127. echo "${logs}" | tee -a ${script_log}
  128. fi
  129. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 清理超过${log_overdue}天的日志完成" | tee -a ${script_log}
  130. }
  131. #清理:最大文件模式
  132. clean_max() {
  133. filelist=$(find ${log_path} -name "${log_key}" | xargs ls -tr | grep ${log_path})
  134. filelist_count=$(echo "${filelist}" | wc -l)
  135. i=0
  136. for line in $filelist; do
  137. i=$(expr ${i} + 1)
  138. nowsize=$(find ${log_path} -name "${log_key}" | xargs du -cm | tail -1 | awk '{print $1/1024}')
  139. if [[ $(echo "$nowsize > $log_max"|bc) -eq 1 ]]; then
  140. if [[ $i -eq $filelist_count ]]; then
  141. echo "" >$line
  142. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 超过最大内存,当前:${nowsize}G,限制:${log_max}G,置空清理:${line}" | tee -a ${script_log}
  143. else
  144. logs=$(echo $line | xargs rm -f) #清理日志
  145. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 超过最大内存,当前:${nowsize}G,限制:${log_max}G,清理:${line}" | tee -a ${script_log}
  146. fi
  147. else
  148. echo "$(date "+%Y-%m-%d %H:%M:%S") [$log_name] 未超过最大内存,当前:${nowsize}G,限制:${log_max}G,不需要清理" | tee -a ${script_log}
  149. break
  150. fi
  151. done
  152. }
  153. run

3. 给予可执行权限

  1. chmod a+x /app/script/log_clean/log_clean.sh

4. 加入定时任务

  1. echo "00 03 * * * root bash /app/scripts/log_clean/log_clean.sh >/dev/null 2>&1" >/etc/cron.d/log_clean