forrestrun 回復于:2003-06-24 11:07:59 |
看man的說明,似乎按照一個小時可以記錄,但是合并處理是問題,誰碰到過這種問題。 |
HonestQiao 回復于:2003-06-24 11:58:29 |
四、web服務器日志輪循
web服務器日志輪循比較好的方式有三種:第一種方法是利用Linux系統自身的日志文件輪循機制:logrotate;第二種方法是利用apache自帶的日志輪循程序rotatelogs;第三種是使用在apache的FAQ中推薦發展已經比較成熟的一個日志輪循工具cronolog。 對于大型的WEB服務來說,其往往使用實用負載均衡技術提高web站點服務能力,這樣后臺有多個服務器提供WEB服務,這大大方便了服務的分布規劃和擴展性,但多個服務器的分布就需要對日志進行合并統一進行統計分析。因此為了保證統計的精確性就需要嚴格按照每天的時段來自動生成日志文件。 4.1 logrotate實現日志輪循 首先我們討論采用Linux系統自身的日志文件輪循機制:logrotate的方法。Logrotate是Linux系統自身帶的一個日志輪循程序,是專門對各種系統日志(syslogd,mail)進行輪循的程序。該程序是由運行程序的服務crond來每天凌晨4:02運行的,可以在/etc/cron.daily目錄下可以看到logrotate文件,其內容如下: #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf 可以看到每天清晨crond都會啟動/etc/cron.daily目錄下的logrotate腳本來進行日志輪循。 而在/etc/logrorate.conf中可以看到內容如下: # see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress # RPM packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp rotate 1 } # system-specific logs may be also be configured here. 從logrotate的配置文件中可以看到除了wtmp以外,需要滾動的日志的配置都保存在/etc/logroate.d目錄下。因此我們只需要在該目錄下創建一個名為apache的配置文件,來指示logrotate如何輪循web服務器的日志文件即可,下面是一個示例: /www/log/secfocus { rotate 2 daily missingok sharedscripts postrotate /usr/bin/killall -HUP httpd 2> /dev/null || true endscript } /www/log/tomorrowtel { rotate 2 daily missingok sharedscripts postrotate /usr/bin/killall -HUP httpd 2> /dev/null || true endscript } 這里“rotate 2”表示輪循時只包括兩個備份文件,也就是只有:aclearcase/" target="_blank" >ccess_log、access_log.1、access_log.2三個日志備份文件。就這樣就實現了對兩個虛擬主機的日志文件的輪循。后面我們會討論如何使用日志統計分析軟件對日志文件進行處理。 這種方法的優點是不需要其他第三方工具就可以實現日志輪循,但是對于重負載的服務器和使用負載均衡技術的web服務器來說這種方法就不是很實用。因為它是對相應服務進程發出一個-HUP重啟命令來實現日志的截斷歸檔的,這樣會影響服務的連續性。 4.2 使用apache自帶的rotatelogs實現日志輪循 apache提供了將不把日志直接寫入文件,而是通過管道發送給另外一個程序的能力,這樣就大大的加強了對日志進行處理的能力,這個通過管道得到的程序可以是任何程序:如日志分析,壓縮日志等。要實現將日志寫到管道只需要將配置中日志文件部分的內容替換為“|程序名“即可,例如: # compressed logs CustomLog "|/usr/bin/gzip -c >> /var/log/access_log.gz" common 這樣就可以實用apache自帶的輪循工具:rotatelogs來對日志文件進行輪循。rotatelogs基本是用來按時間或按大小控制日志的。 CustomLog "|/www/bin/rotatelogs /www/logs/secfocus/access_log 86400" common 上面的示例中apache訪問日志被發送給程序rotatelogs,rotatelogs將日志寫入/www/logs/secfocus/access_log,并每隔86400秒(一天)對日志進行一次輪循。輪循以后的文件名為/www/logs/secfocus/access_log.nnnn,這里nnn是開始記錄日志的時間。因此為了將日志按天對齊就需要在凌晨00:00啟動服務,使得每天輪循得到的日志剛好是完整一天的日志,以提供給訪問統計分析程序進行處理。如果是00:00開始生成新的日志,那么輪循得到的日志就是access_log.0000。 4.3 使用cronolog實現日志輪循 首先需要下載和安裝cronolog,可以到http://www.cronolog.org下載最新版本的cronolog。下載完畢以后,解壓安裝即可,方法如下所示: [root@mail root]# tar xvfz cronolog-1.6.2.tar.gz [root@mail root]# cd cronolog-1.6.2 [root@mail cronolog-1.6.2]# ./configure [root@mail cronolog-1.6.2]# make [root@mail cronolog-1.6.2]# make check [root@mail cronolog-1.6.2]# make install 這就完成了cronolog的配置和安裝,默認情況下cronolog是安裝在/usr/local/sbin下。 修改apache日志配置命令如下所示: CustomLog "|/usr/local/sbin/cronolog /www/logs/secfocus/%w/access_log" combined 這里%w表示按照日期星期幾在不同的目錄下保存日志,這種方式會保存一周的日志。為了進行日志分析,需要每天將該日志文件拷貝(或移動,如果不希望保存一周的日志)到一個固定的位置以方便日志分析統計文件進行處理,實用crontab –e,如下添加定時任務: 5 0 * * * /bin/mv /www/logs/secfocus/`date -v-1d +\% w`/access_log /www/logs/secfocus/access_log_yesterday 這樣再使用日志統計分析程序的對文件access_log_yesterday進行處理。 對于使用負載均衡技術的大型站點,就存在多個服務器的訪問日志的合并處理問題.對于這種情況,各個服務器定義或移動日志文件時就不能使用access_log_yesterday了,就應該帶上服務器編號了,例如服務器IP地址等信息以區分。然后在各個服務器上運行網站鏡像和備份服務rsyncd(參考文章” 用rsync實現網站鏡像和備份”,ttp://www.linuxaid.com.cn/engineer/ideal/article/rsync.htm),然后將每個服務器每天的安裝配置文件通過rsync下載到專門進行訪問統計分析的服務器上進行合并。 合并多個服務器的日志文件,例如:log1 log2 log3并輸出到log_all中的方法是: sort -m -t " " -k 4 -o log_all log1 log2 log3 -m: 使用 merge優化算法,-k 4表示根據時間進行排序,-o表示將排序結果存放到指定的文件中。 |
forrestrun 回復于:2003-06-24 12:45:20 |
我使用的是cronolog做的,每天一個日志,但是,就是這樣日志文件還是太大,我又不希望更改日志格式,就必須考慮將日志8個小時記錄一次,或者12小時一次。
cronolog的分離是根據date分離的,應該可以細分到小時的。但是我如何合并8小時一個文件,或者有沒有更好解決的辦法。 gzip方式肯定將日志壓縮存放,但是對我也沒有用的,一旦要解壓縮處理分析日志,將有問題。 |