第二天:
如果順利切換過去,接下來就是將先前/etc/logrotate.d/tomcat中mark掉的mail developer等設定恢復。
再來可能會遇到的問題就是,昨天logrotate後,那個20幾GB的catalina.out現在只是檔名尾巴加上日期,大小還是20幾GB大。如果我們希望也能夠將它切一切,也一樣照日期分成一個一個檔,那應該如何處理呢?
由於沒有現成的工具程式(或是我不知道有這種工具)可以處理catalina.out-20120801,於是我先土法煉鋼來處理這個切檔的工作:
先用vi開啟這個檔案(是的,20幾GB),然後找到昨天的日期第一次出現在這個檔案的行數,再找出檔案尾巴的行數,將這個區塊寫到另一個檔案去,例如catalina.out-20120731,再將原先的catalina.out-20120801檔案刪掉該區塊的內容。這樣子重複執行直到將檔案全部切好為止。
我手動切了三個日期後,就覺得這樣子下去不是辦法,應該可以寫個shell script來處理這件事:
1.使用grep -n指令搭配head -1來找出某個日期第一次出現在檔案中的行號:
grep -n "2012/7/31" catalina.out-20120801|head -1|awk '{print $1}'|cut -d":" -f1
2.然後利用wc -l 來找出檔案尾巴行數:
wc -l catalina.out-20120801|awk '{print $1}'
3.接下來利用expr將兩個行號相減再加一:
expr $end - $start + 1
4.再利用tail 指令搭配行數,將自檔尾倒數幾行寫到檔案catalina.out-20120731去
tail -$lines catalina.out-20120801 > catalina.out-20120731
5.最後再利用sed指令去刪掉剛剛自起始行號到結尾行號中間的檔案內容
sed -i -e "${start},${end}d" catalina.out-20120801
搭配一下日期年月日的迴圈後可以組成如下:
split_catalina_out.sh:
#!/bin/bash
file=catalina.out-20120801
for y in {2012..2011}
do
for m in {12..1}
do
for d in {31..1}
do
target="$y/$m/$d"
target_ym="${y}${m}"
if [ $m -lt 10 ]; then
target_ym="${y}0${m}"
fi
target_date="${target_ym}${d}"
if [ $d -lt 10 ]; then
target_date="${target_ym}0${d}"
fi
start=`grep -n $target $file|head -1|awk '{print $1}'|cut -d":" -f1`
if [ "$start" == "" ]; then
continue
fi
end=`wc -l $file|awk '{print $1}'`
lines=`expr $end - $start + 1`
echo $target_date
tail -$lines $file > ./catalina.out-$target_date
sed -i -e "${start},${end}d" $file
done
done
done
建議先複製一份catalina.out-20120801到/tmp目錄,測試看看,以免毀了原始紀錄檔。將split_catalina_out.sh放在和catalina.out-20120801相同的目錄下,執行時程式會自動判斷該日期是否存在於檔案中,如不存在將自動跳過。如此不斷重複直到回圈執行完畢。