Linux定時清除日誌與Catalina日誌分割

踩到的坑

除了開發工做以外,本人還有一項瑣碎的工做,就是天天定時查看網站相關的Linux機器運行狀況。
剛開始時,Linux機器都運行正常,本人就鬆散了不少,從天天的檢查,到後來的一週檢查一兩次。
後來,網站受到不明來源頻繁攻擊,致使某些後臺組件崩潰(這個問題有時間再另寫博文述之),可是網站服務器仍然運行良好。
可是糟糕的事仍是來了,而後就在一個月以前,老大忽然收到有關Linux服務器磁盤使用率達到90%以上!這下有些慌了,趕忙巡檢機器的運行狀況。發現正式環境機器的磁盤tomcat安裝目錄就佔了30多個G(總共44G)。linux

du -sh /home/tomcat # -s 表示統計總和,單位爲G;-h 表示統計各文件大小
du -bs /home/tomcat # -b 表示統計單位爲bite
df -h # 統計查看系統磁盤利用狀況,分爲物理利用率和邏輯利用率

老大提醒我跟日誌文件有關,進去一看logs文件夾,果真是,估計有幾百個日誌文件吧,其大小不一。好吧,就是你啦!nginx

填坑

措施一:rm -rf filepath

剛開始,爲了趕忙解決這個問題,就直接簡單粗暴的使用 rm 命令將其刪除,只保留一個月以內的日誌。正則表達式

rm -rf logs/*2017*.log && rm -rf logs/*201801*.log && rm -rf logs/*201802*.log

從新使用 df -h 查下磁盤,降到了70%左右,嗯嗯,還能夠,而後就如法炮製將其餘幾臺機器也刪除舊日誌。shell

呵呵,就這幾下子,也過小瞧坑個人威名

進行上述操做以後,覺得能夠安靜的休息一個禮拜吧。
可是沒想到次日又收到告警信息,我了去,要了老命啊,前段時間攻擊已經夠折騰了,我這裏不能出事啊!
仔細查看所剩很少日誌文件,其大小都還能夠接收。對比來對比去,發現原來是 catalina.out 文件惹得禍,查下大小,尼瑪20多個G。好吧,算你狠!segmentfault

措施二:分割 catalina 日誌

網上查找資料後,有網友推薦使用 logrotate 日誌輪詢進行日誌分割。好的說幹就幹。
如今 /etc/logrotate.d/ 下面建立本身的輪詢任務文件 tomcat 吧:tomcat

cat >/etc/logrotate.d/tomcat << EOF
/home/tomcat-hsip/logs/catalina.out{
    copytruncate
    daily
    rotate 7
    missingok
    compress
    size 16M
}
EOF

這裏咱們設置天天進行 Catalina.out 文件輪轉(daily),至多保存7個副本(rotate 7),同時壓縮分割後的日誌文件(compress),當日志文件大於16MB時,就輪轉(size 16M)。
這裏須要明白一下幾點:bash

  • 天天晚上 crond 守護進程會運行在 /etc/cron.daily 目錄中的任務列表;
  • 與 logrotate 相關的腳本也在 /etc/cron.daily 目錄中。運行的方式爲 /usr/bin/logrotate /etc/logrotate.conf;
  • /etc/logrotate.conf 文件 include 了 /etc/logrotate.d/ 目錄下的全部文件。還包括咱們上面剛建立的 tomcat 文件;
  • /etc/logrotate.d/tomcat 文件會觸發 /home/tomcat-hsip/logs/catalina.out 文件的輪轉。

爲了儘快解決問題,設置好了輪詢配置以後,咱們立刻運行上述配置文件:服務器

logrotate --force /etc/logrotate.d/tomcat  # --force 或 -f 表示強制執行輪詢操做

手動執行以後,過了一下子,Catalina被分割掉了一大半,其文件格式爲 catalina.out.1.gz ,其中1是執行次序。若咱們再次執行上述命令,catalina.out.1.gz 將會改名爲 catalina.out.2.gz ,最新執行生成的分割文件將會成爲 catalina.out.1.gz
接着執行措施一中的命令,將分割出來的日誌刪掉,磁盤頓時安靜啦。^v^測試

措施三:定時清除日誌

想着也不能我每次都手動來清除這個日誌和分割出來的 Catalina 日誌文件吧。弄個定時任務本身跑唄!
既然 logrotate 須要用到 crond ,那本人將上述命令寫入腳本 deletelogs.sh,讓 crond 自動執行不就OK嗎!優化

#!/bin/bash
#可填寫多個路徑
workdir=("/home/tomcat-hsip/logs")
for wdir in ${workdir[@]}; do
  echo -e "filepath is ${wdir} .\n"
  # .log 文件和包含 log 標記的 .txt文件,以及分割的 catalina.out.1.gz 等壓縮文件
  find $wdir -regex "^.*\(log.*\.txt\|\.log\|catalina.*\.gz\)$" -and -mtime +5 -type f -exec  rm  -rf  {} \;
  if [ $? -eq 0 ]; then
    echo -e `date`" delete logs successfully! \n"
  else
    echo -e `date`" delete logs failed! \n"
  fi
done

這裏咱們用到了 find 命令找到對應的文件,簡要說明下:

  • -regex 此參數表示後面的輸入使用正則表達式進行書寫。若爲 -name 則後面使用通常字符串書寫,此時可使用通配符,但正則相關的符號將會被保留。
  • shell正則:^ 表示正則匹配字符串開頭,$ 表示正則匹配字符串的結尾,其餘一些和正則使用的非字母的符號須要進行轉義;. 表示匹配任意字符;因此文件路徑中出現的 . 須要進行轉義
  • -and 表示再次同等使用命令的相關參數,如此處的 -mtime ;
  • -mtime 表示使用修改時間屬性,後面的 +7 表示知足超過7天,即修改時間在7天以上的文件或文件夾;而 -7 表示知足不足7天, 7 表示恰好7天;
  • -type 表示查找的文件屬性,後面 f 表示查找文件,而 d 表示查找文件夾;
  • -exec 表示後面要對前面匹配的文件或文件夾執行後面的命令。注意後面的命令須要一對兒{},一個空格和一個,最後是一個分號來結束

接着,咱們配置 crontab 定時任務。按下面步驟進行:

  1. 首先判斷 crontab 運行狀態 service crond status ,確保 crontab 是「 is running" 狀態。
  2. 而後編輯 crontab 文件 vi /etc/crontab,在文件末尾增長下面指令:

    0 5 * * * root sh /home/hsip-monitor/deletelogs.sh >> /home/hsip-monitor/deletelogs.log

其配置說明以下:

- crontab定時配置說明: *(分)  *(時)   *(天)  *(月)  *(星期)
- root 指定用戶,後面則是須要執行的 .sh 文件。此處咱們還將執行日誌輸出到 log 文件中,以便備查。

好了,設置完畢,觀察幾天看看運行狀況吧。

問題與優化

crontab 任務沒執行

  1. 在設置清除日誌的 crontab 定時任務以後,次日觀察日誌和文件,發現定時任務並無被執行。網上查找了不少資料不得其要旨。如下幾點能夠明確:

    • 使用 crontab -l 命令發現系統沒有顯示任何定時任務列表;
    • 使用 crontab -e 建立任務文件後,在文件中寫入第2條中所示定時任務後,再次查看定時任務列表,有上述增長的任務;
  2. 在上面所述解決方案並無將問題解決以後,仔細查看 crontab 定時任務發現,原來是參看的博文定時任務命令中缺乏 sh 這個執行命令,雖然看了不少博文,執行sh腳本前面沒有加命令 sh 。不清楚爲何別人能夠執行,可是我這裏不加不行,加了 sh 以後,定時任務就好使了;

Catalina 自動輪轉沒有執行

分割日誌配置在正式環境的機器上沒有被執行,而一臺不常常用的測試機器能卻很好地分割 catalina 日誌,找了不少解決方案都沒有解決。
在解決了 crontab 定時任務不能解決以後的問題後,忽然靈機一動,爲何不能將 logrotate --force /etc/logrotate.d/tomcat 寫到 crontab 的定時任務中呢?
說幹就幹,建立文件 cutoffCatalina.sh 只等明天的執行結果。

#!/bin/bash
/usr/sbin/logrotate --force /etc/logrotate.d/tomcat
if [ $? -eq 0 ]; then
echo -e `date`" cut catalina.out successfully! \\n"
else
echo -e `date`" cut catalina.out failed! \\n"
fi

同時在 /etc/crontab 文件中加入下面配置

50 23 * * * root sh /home/hsip-monitor/cutoffCatalina.sh >> /home/hsip-monitor/cutoffCatalina.log

然而,很遺憾的說,寫入到腳本中執行,一樣執行失敗,懷疑是日誌文件在被操做,從而沒法完成分割。後來老大也提醒,是否是和 catalina 正在讀寫有關?
因而找了一個用戶訪問量少的時間(凌晨5點左右),從新配置:

30 4 * * * root sh /home/hsip-monitor/cutoffCatalina.sh >> /home/hsip-monitor/cutoffCatalina.log

而後出現一個有意思的狀況:

  • 正式環境上日誌被分割成 catalina.out.1.gz ,而測試機器上則被分割成了 catalina.out-20180314.gz ,也就是說:

    • Catalina 正在讀寫時,咱們腳本執行成功,即 --force 參數有效。
    • logrotate 輪詢機制觸發,Catalina在讀寫時,執行輪詢失敗,反之則能成功執行,成功後分割的文件以時間戳命令。

其餘發現

在搜索解決問題過程當中,有網友所述方法不知道行不行,網友沒說爲何linux - logrotate管理分割nginx日誌無效 - SegmentFault 思否 )。好吧,將正式機器先這麼設置吧,再保險下吧。

【完】

相關文章
相關標籤/搜索