Chinaunix首页 | 论坛 | 博客
  • 博客访问: 41879
  • 博文数量: 18
  • 博客积分: 95
  • 博客等级: 民兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-20 12:05
文章分类
文章存档

2013年(17)

2012年(1)

我的朋友

分类: 系统运维

2013-01-28 10:49:30


在開始之前有個故事要和大家分享。有一次我朋友的公司裡有一台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的語法大致上看起來就像下面這個樣子,

logadm /var/adm/sshdlog -p now

第一個參數是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來壓縮被更換掉的舊檔。
-alog檔更換後要執行的指令。
-blog檔更換前要執行的指令。
-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`'
# logadm -V| grep error
/var/apache/logs/error_log -C 8 -s 10m -z 0 -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 -V|grep acce
/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
# logadm -V| grep apache_log
apache_log -C 9 -a 'kill -HUP `cat /var/run/apache2/httpd.pid`' -p 1m /var/apache/logs/access_log /var/apache/logs/error_log這個例子好像和前面講的不太一樣,-w 後面接的不再是檔案名稱,取而代之的是apache_log。其實apache_log這是一個自取的識別字,logadm會自動判斷你給的識別字是否為檔案名稱(開頭是否為/);如果是,你可以省略後面的檔案名稱參數。如果不是則後面的檔案名稱就一定要給。前面二個例子的識別字我們都用檔案名稱來代替,而這個例子因為有多個目的檔案,所以要特別再取一個識別字。
當全部都設定好之後,只要直接執行logadm不用加任何的參數,logadm會自動去讀取/etc/logadm.conf,並將符合條件的 log檔進行更換。系統安裝好後root的crontab即已排定每天的3:10會執行logadm,所以只要等時間到log自然就會被換掉。

----------------------------------
以下是自己实验的一个例子:
# crontab  -l |grep logadm
10 3 * * * /usr/sbin/logadm
# du -sh messages*
  14K   messages
 240K   messages.0
 9.9M   messages.1
  30M   messages.2
 2.5M   messages.3
# logadm   /var/adm/messages  -p  now
# du -sh messages*
   0K   messages
  14K   messages.0
 240K   messages.1
 9.9M   messages.2
  30M   messages.3


阅读(953) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~