find 命令刪除冗餘 Nginx 錯誤日誌並實現備份

cn-five發表於2020-08-30

find 命令是 Linux 系統一種常見的命令,有著強大的功能,缺點是遍歷檔案查詢,效率相對低。

當你的 LNMP 平臺正式開始運作,每天會產生大量的日誌,包括 PHP 、 Nginx 、 Mysql 、 Redis 等等各種各樣的登入、警告、提示、錯誤資訊。如果日誌所在目錄過於臃腫,可能會導致伺服器執行緩慢甚至暫停執行。所以,清理這些日誌成為後端工程師日常工作中的一部分。
清理方式多種,現介紹用 find 命令進行清理的方法。
命令格式如下

find 目標目錄 查詢條件 查詢檔案 -exec 執行命令 {} \;
其中 {} 表示查詢結果, \; 為固定格式。

如果你想查詢 /var/log/ 目錄下大於 200k 以 .log 結尾的檔案,並且想把查詢結果複製一份在 /opt/bak/ 目錄下作為備份,命令如下

find /var/log/ -size +200k -name '*.log' -exec cp {} /opt/bk/ \;

編寫 Shell 指令碼 clear_logs.sh 減少每次手寫程式碼量,並且易於更改。

#!/bin/bash
#
#

log_path='/usr/local/nginx/logs/'
new_log_path='/home/error_logs_bk/'

cd $new_log_path

# 以年月日時分秒作為檔名稱字首
date=`date +"%Y:%m:%d:%H:%M:%S"`

# 生成備份目錄
mkdir $date.error.log

# 先備份
find $log_path -name '*error.log' -exec cp {} /home/error_logs_bk/$date.error.log \;

# 備份成功輸出成功資訊,否則就報錯退出
if [ $? -eq 0 ];then
    echo 'Errorlogs backup successfully!'
else
    echo 'Failure in backup fo errorlogs!'
    exit
fi

# 刪除成功輸出成功信,否則就報錯退出
find $log_path -name '*error.log' -exec rm -rf {} \;

if [ $? -eq 0 ];then
    echo 'Errorlogs deleted successfully!'
else
    echo 'Failure in deletion fo errorlogs!'
    exit
fi

執行指令碼

sh clear_logs.sh

輸出

Errorlogs backup successfully!
Errorlogs deleted successfully!

進入 /home/error_logs_bk/ 目錄檢視,成功實現備份。

2020:08:30:00:16:16.error.log

如果想開機就執行指令碼,在 #/bin/bash 下新增以下程式碼

#chkconfig:2345 80 30
#description:auto_run

新增至開機自動啟動專案中

chkconfig --add clear_logs.sh

如果計劃每週六凌晨零點執行,可以使用 crontab 命令定時刪除冗餘日誌,執行 crontab -e

00 00 * * 6 /bin/bash /opt/shells/clear_logs.sh
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章