分类: 系统运维
2011-03-31 14:44:54
log檔越來越大!Solaris 9提供你一個好用的指令來管理log檔的輪替。
在開始之前有個故事要和大家分享。有一次我朋友的公司裡有一台Sun的機器疑似crash後重開機,他的第一個反應是去看 messages log,結果使用vi來開啟messages檔時,vi跑了二分多鐘後,丟出一個訊息"檔案太大了,它開不了"。他轉頭問問我怎麼會這樣?於是我接手幫忙處理。執行uptime的結果確認是有重開機過,但為何重開機?則要看messages的內容才會知道,問題是vi開不了messages,所以我只好用tail+more來慢慢看。為什麼開不了呢?一看才知messages這個檔案竟然超過 2G,最早的一筆記錄是四年多前的。天呀!
接著想了解在機器掛掉之前有誰在線上操作,結果last一跑......約五分鐘後螢幕才開始有東西跑出來。為什麼呢?因為和last相關的檔案wtmpx也超過500MB......。最早的記錄的時間我已經不想知道了。(messages不是有newsyslog會去換檔案嗎?是的,但不知在何時crontab裡已經沒有這一項存在了。唉,天兵管理員!)
早期的Solaris(9 以前)並沒有一個真正可用的log輪替程式來做系統log的管理。所以如果管理員沒有自己做適當的處理,硬碟空間很容易就被吃光了。不然就會發生像上述的事情,檔案大到很難開啟。
以往的Solaris就只有一支newsyslog的簡單script來做messages的輪替的工作。不然就要自己安裝logrotate的套件來做這一類的工作。雖然logrotate很好用,但總是還要抓下來安裝。不過自從Solaris 9開始,Sun終於聽到使用者的聲音了。
Solaris 9開始提供了一支程式logadm專門用來做系統log的管理工作。個人覺得它和logrotate還有點相像,只是它的設定是一個log檔一行,而logrotate是一個log檔一個區塊。下面就來看看logadm要如何使用。
logadm有一個設定檔/etc/logadm.conf,該檔是一個純文字檔,所以你可以直接用vi去編輯它,或是使用logadm來變更設定。雖然可以直接編輯設定檔,不過使用logadm來變更設定時logadm會檢查語法是否正確,所以建議還是使用指令去變更設定。
Solaris在安裝完成後,root的crontab預設就會有一些東西定期的去執行,其中一個就是logadm。你可以用crontab -l來查看。所以只要把設定檔寫好後,系統就會自動執行,你也不用再操心了。接下來就來看看logadm要如何使用。
logadm的語法大致上看起來就像下面這個樣子,
第一個參數是log檔的名字(不全然是,後面會說明),這裡我們用的是/var/adm/sshdlog。-p指的是週期(period),這個值是數字接d(day)、w(week)、m(month)、y(year)。如10d,表10天;2w,表二個星期,14天。m雖然是指月,但實際是三十天哦!它可不會自動分辨大小月。另外還有二個特別的時間值,一個就是上面用的now,另外一個是never 。now就是不管如何,現在馬上給我換掉;never則是永遠都不要換,除非其他條件成立。
logadm的參數很多,下表列出幾個常用的參數
-C n | 保留的數量,如果沒有指定任何的過期條件,預設為-C 10。 |
-p n[dwmy] | 輪替週期 |
-s n[bkmg] | 檔案大小,當指定的log檔的大小大於等於這個值時就更換。 |
-z n | 使用gzip來壓縮被更換掉的舊檔。 |
-a | log檔更換後要執行的指令。 |
-b | log檔更換前要執行的指令。 |
-g | 新檔案的擁有群組,不給就和原檔案一樣。 |
-o | 新檔案的擁有人,不給就和原檔案一樣。 |
-m | 新檔案的權限,不給就和原檔案一樣。 |
-w | 將此設定寫入設定檔。 |
-r | 將此設定從設定檔中移除。 |
-V | 列出設定檔的內容。 |
假設apache的error_log,希望每10MB換一次,最少保留8份;另外為了避免浪費空間,舊的檔案要壓縮。下面的範例可以滿足我們的需求。
# logadm -w /var/apache/logs/error_log -C 8 -s 10m -z0 -a 'kill -HUP `cat /var/run/apache2/httpd.pid`'然後是access_log,由於log要留做分析使用,所以最少要保留2個月:也為了避免單一檔案太大,所以每個星期要換一個新的檔案。
# logadm -w /var/apache/logs/access_log -C 9 -p 1w -a 'kill -HUP `cat /var/run/apache2/httpd.pid`'logadm在檔案名稱部份也支援*,?,{}。所以上面的例子也可以改成下面的方式
# logadm -w apache_log -C 9 -p 1m -a 'kill -HUP `cat /var/run/apache2/httpd.pid`' /var/apache/logs/{access,error}_log