一、apache日誌按日期記錄
pache的設定檔中找到
ErrorLog logs/error_log
CustomLog logs/access_log common
Linux系統配置方法:
將其改為
ErrorLog “| /usr/local/apache/bin/rotatelogs /home/logs/www/%Y_%m_%d_error_log 86400 480″
CustomLog “| /usr/local/apache/bin/rotatelogs /home/logs/www/%Y_%m_%d_access_log 86400 480″ common
Windows系統下配置方法:
#ErrorLog “|bin/rotatelogs.exe logs/vicp_net_error-%y%m%d.log 86400 480″
#CustomLog “|bin/rotatelogs.exe logs/vicp_net_access-%y%m%d.log 86400 480″ common
第一次不知道設定480這個參數,導致日誌記錄時間和伺服器時間相差8小時,原來是rotatelogs有一個offset參數,表示相對於UTC 的時差分鐘數,中國是第八時區,相差480分鐘。86400是表示1天。
附rotatelogs說明
rotatelogs logfile [ rotationtime [ offset ]] | [ filesizeM ]
選項
logfile
它加上基準名就是記錄檔名。如果logfile中包含’%’,則它會被視為用於的strftime(3)的格式字串;否則,它會被自動加上以秒為單位 的.nnnnnnnnnn尾碼。這兩種格式都表示新的日誌開始使用的時間。
rotationtime
記錄檔回卷的以秒為單位的間隔時間
offset
相對於UTC的時差的分鐘數。如果省略,則假定為0,並使用UTC時間。比如,要指定UTC時差為-5小時的地區的當地時間,則此參數應為-300。
filesizeM
指定回卷時以MB為單位的尾碼字母M的檔案大小,而不是指定回卷時間或時差。 二、設定apache日誌記錄格式
定製記錄檔的格式涉及到兩個指令,即LogFormat指令和CustomLog指令,預設httpd.conf檔案提供了關於這兩個指令的幾個 樣本。
LogFormat指令定義格式並為格式指定一個名字,以後我們就可以直接引用這個名字。CustomLog指令設定記錄檔,並指明記錄檔所用 的格式(通常通過格式的名字)。
LogFormat指令的功能是定義日誌格式並為它指定一個名字。例如,在預設的httpd.conf檔案中,我們可以找到下面這行代碼:
LogFormat “%h %l %u %t /”%r/” %>s %b” common
網管聯盟www.bitsCN.com
該指令建立了一種名為“common”的日誌格式,日誌的格式在雙引號包圍的內容中指定。格式字串中的每一個變數代表著一項特定的資訊,這些資訊按照格 式串規定的次序寫入到記錄檔。
Apache文檔已經給出了所有可用于格式串的變數及其含義,下面是其譯文:
%…a: 遠程IP地址
%…A: 本地IP地址
%…B: 已發送的位元組數,不包含HTTP頭
%…b: CLF格式的已發送位元組數量,不包含HTTP頭。例如當沒有發送資料時,寫入‘-’而不是0。
%…{FOOBAR}e: 環境變數FOOBAR的內容
%…f: 檔案名稱字
%…h: 遠程主機
%…H 請求的協議
%…{Foobar}i: Foobar的內容,發送給伺服器的請求的標題行。
%…l: 遠程登入名稱字(來自identd,如提供的話)
%…m 請求的方法
%…{Foobar}n: 來自另外一個模組的註解“Foobar”的內容
%…{Foobar}o: Foobar的內容,應答的標題行
%…p: 伺服器響應請求時使用的連接埠
%…P: 響應請求的子進程ID。
%…q 查詢字串(如果存在查詢字串,則包含“?”後面的部分;否則,它是一個Null 字元串。) %…r: 請求的第一行
%…s: 狀態。對於進行內部重新導向的請求,這是指*原來*請求 的狀態。如果用%…>s,則是指後來的請求。
%…t: 以公用日誌時間格式表示的時間(或稱為標準英文格式)
%…{format}t: 以指定格式format表示的時間
%…T: 為響應請求而耗費的時間,以秒計
%…u: 遠端使用者(來自auth;如果返回狀態(%s)是401則可能是偽造的)
%…U: 使用者所請求的URL路徑
%…v: 響應請求的伺服器的ServerName
%…V: 依照UseCanonicalName設定得到的伺服器名字
在所有上面列出的變數中,“…”表示一個可選的條件。如果沒有指定條件,則變數的值將以“-”取代。分析前面來自預設httpd.conf檔案的 LogFormat指令樣本,可以看出它建立了一種名為“common”的日誌格式,其中包括:遠程主機,遠程登入名稱字,遠端使用者,請求時間,請求的第一 行代碼,請求狀態,以及發送的位元組數。
有時候我們只想在日誌中記錄某些特定的、已定義的資訊,這時就要用到“…”。如果在“%”和變數之間放入了一個或者多個HTTP狀態碼,則只有當 請 求返回的狀態碼屬於指定的狀態碼之一時,變數所代表的內容才會被記錄。例如,如果我們想要記錄的是網站的所有無效連結,那麼可以使用:
LogFormat %404{Referer}i BrokenLinks
反之,如果我們想要記錄那些狀態碼不等於指定值的請求,只需加入一個“!”符號即可:
LogFormat %!200U SomethingWrong 三、專門記錄某個記錄
SetEnvIfNoCase User-Agent Baiduspider baidu_robot
LogFormat “%h %t /”%r/” %>s %b” robot
CustomLog “|/usr/local/apache2.2.0/bin/rotatelogs /usr/local/apache2.2.0/logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot
windows下
CustomLog “|bin/rotatelogs.exe logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot
這樣在logs目錄下,就會每天產生baidu_年月日.txt的日誌了,每條的記錄和下面的類似:
61.135.168.14 [22/Oct/2008:22:21:26 +0800] “GET / HTTP/1.1″ 200 8427
apache記錄備份: 按照Linux系統配置方法配置好 伺服器A之後,就可以去備份伺服器B寫備份指令碼了,這裡假設伺服器A的IP為:192.168.0.3,指令碼如下: [Copy to clipboard] View Code BASH
# apache log backup #!/bin/bash # 擷取昨天的日期 logfilename=`date -d yesterday +%Y%m%d` # 設定記錄備份檔案路徑 backupfilepath=/var/www/logs/ # 備份錯誤記錄檔檔案 echo "get example error log:" cd ${backupfilepath} # 獲到伺服器A昨天的記錄檔 scp root@192.168.0.3:/var/log/httpd/example_error_log/${logfilename} ./example/error/ cd ${backupfilepath}example/error/ # 打包壓縮記錄檔 tar zcvf ${logfilename}.tar.gz ${logfilename} rm -rf ${logfilename} # 備份訪問記錄檔 echo "get example access log:" cd ${backupfilepath} scp root@192.168.0.3:/var/log/httpd/example_access_log/${logfilename} ./example/access/ cd ${backupfilepath}example/access/ tar zcvf ${logfilename}.tar.gz ${logfilename} rm -rf ${logfilename} echo "done." |
在準備運行以上指令碼以前,要先確認兩台伺服器之間用ssh-keygen命令產生的密鑰設定了信任關係
然後將該指令碼命名為apachelog_backup.sh儲存到/var/cron/目錄下。 確認兩台伺服器的備份目錄都已建立好,測試一下指令碼,比如到伺服器A的備份目錄建立一個用前一天日期命名的記錄檔,內容隨便, 然後再到備份伺服器B去先執行一下指令碼,查看是否備份成功。
最後用 crontab -e 命令在linux的定時任務中加入自動執行任務,讓指令碼在每天淩晨12點之後自動執行,如下:
30 00 * * * sh /var/cron/apachelog_backup.sh
這裡設定了每天零點30分執行指令碼。