1. 程式人生 > >apache 訪問日誌access_log 配置和解析 rotatelogs分割日誌

apache 訪問日誌access_log 配置和解析 rotatelogs分割日誌

分為7個部分:

(1)第一項資訊是遠端主機的地址,即它表明訪問網站的究竟是誰。(可以要求apache查出所有的主機名字,並在日誌檔案中用主機名字來替代IP地址,但這種做法會極大的影響伺服器記錄日誌的速度,從而降低整個網站的效率,不值得推薦)。
          然而,如果確實有必要讓apache找出遠端主機的名字,可以使用如下指令:

HostNameLookups on

     如果HostNameLookups設定成double而不是on,日誌記錄程式將對它找到的主機名字進行反向查詢,驗證該主機名字確實指向了原來出現的IP地址。

(2)上例日誌記錄的第二項是空白,用一個“-”佔位符替代。實際上絕大多數時候這一項都是如此。這個位置用於記錄瀏覽者的標識,這不只是瀏覽者的登入名字,而是瀏覽者的email地址或者其他唯一識別符號。這個資訊由identd返回,或者直接由瀏覽器返回。(為了避免使用者的郵箱被垃圾郵件騷擾,第二項就用“-”取代了)。

(3)日記記錄的第三項也是空白。這個位置用於記錄瀏覽者進行身份驗證時提供的名字。當然,如果網站的某些內容要求使用者進行身份驗證,那麼這項資訊室不會空白的。但是,對於大多數網站來說,日誌檔案的大多數記錄中這一項仍舊是空白的。

(4)日誌記錄的第四項是請求的時間。這個資訊用方括號包圍,而且採用“公用日誌格式”或者“標準英文格式”。因此,時間資訊最後的“-0400”表示伺服器所處時區位於UTC之前的4小時。

(5)日誌記錄的第五項資訊或許是整個日誌記錄中最有用的資訊,它告訴我們伺服器受到的是一個什麼樣的請求。該項資訊的典型格式是“METHOD RESOURCE PROTOCOL”即“方法 資源 協議”(我們通常進行日誌監控的時候,主要也是看這項內容)。例子中METHOD是GET,還有POST、HEAD等其他型別,主要是這三種。

RESOURCE是指瀏覽者向伺服器請求的文件或者URL。在這個例子中,瀏覽者請求的是“/”,即網站的根或者主頁。大多數情況下,“/”指向DocumentRoot目錄的index.html文件,但根據伺服器配置的不同也可能指向其他檔案。

PROTOCOL通常是HTTP,然後再加上版本號。

(6)日誌的第六項資訊室狀態程式碼。它告訴我們請求是否成功,或者遇到了什麼樣的錯誤。大多數時候這項是200,它表示伺服器已經成功的響應瀏覽器的請求,一切正常。(以2開頭的狀態碼錶示成功,以3開頭的狀態碼錶示由於各種不同的原因使用者請求被重定向到了其他位置,以4開頭的狀態程式碼表示客戶端存在某種錯誤,以5開頭的狀態程式碼表示伺服器遇到了某個錯誤)。

(7)日誌記錄的第七項表示傳送客戶端的總位元組數。它告訴我們傳輸是否被打斷(即該數值是否和檔案的大小相同)

這裡可以使用linux 命令 分析 access日誌1.以url進行分析 一般的日誌格式
10.0.7.99 - - [28/Dec/2015:22:36:10 -0800] "GET /install/ HTTP/1.1" 200 512
   1           2 3     4                                      5           6        7                            8     9   (以空格分段)


1.以url進行分析

 統計某url xxx/index
,一天的訪問次數

         直接查詢、統計
# cat access_log |grep xxx/index | wc -l   
         兩次精確查詢、統計
# cat access_log |grep 'xxx/index' | grep '/images/index/e1.gif'|wc|awk '{print $1}'
  
 
統計日誌中訪問超過100次的頁面

#cat access_log | cut -d ' ' -f 7 | sort |uniq -c |  awk '{if ($1 > 100) print $0}' | less            
        #
cat access_log |awk '{print $7}'| sort | uniq -c | awk '{if($1>100) print $0}' | less檢視最近1萬條訪問中最高的頁面

#cat access_log |tail -10000|awk '{print $7}'|sort|uniq -c|sort -nr|less

?前五天的訪問次數最多的網頁
#cat access_log|awk '{print $7}'|uniq -c |sort -n -r|head -20

或者

awk '{print $11}' access_log | sed 's/^.*cn\(.*\)\"/\1/g' | sort | uniq -c | sort -rn | head

awk 首先將每條日誌中的訪問頁面抓出來,如日誌格式被自定義過,可以 -F 定義分隔符和 print指定列;
sed 's/^.*cn\(.*\)\"/\1/g'     將 .*cn\(.*\)\" 字串用\1 字串替代,末端的g表示在行內進行全域性替換,即某行                       出現多個要替換字元,則全部替換;
                    
用sed的替換功能將”http://www.a.cn/common/index.php”替換成括號內的內容                                                                                          ”http://www.a.cn(/common/index.php)”
sed 's/^.*cn/(.*/)/"//1/g'

sort進行初次排序,為的使相同的記錄排列到一起;
upiq -c 
合併重複的行,並記錄重複次數;sort -nr按照數字進行倒敘排序;

?當前WEB伺服器中連線次數最多的ip地址
#netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr

?檢視日誌中訪問次數最多的前10個IP
                        以空格分段取第一欄位  去重複統計總數
#cat access_log  |cut -d ' ' -f 1 |sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 |less

 檢視檔名升序              按數字降序   列印整行       檢視前十      分頁顯示


或者

awk '{print $1}' access_log | sort | uniq -c | sort -nr | head -n 10

awk 首先將每條日誌中的IP抓出來,如日誌格式被自定義過,可以 -F 定義分隔符和 print指定列;
sort
進行初次排序,為的使相同的記錄排列到一起;
upiq -c 
合併重複的行,並記錄重複次數。sort -nr按照數字進行倒敘排序。
head進行前十名篩選;

?檢視日誌中出現100次以上的IP
cat access_log  |cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}' | sort -nr |less
                                                                          第一欄位大於100 則輸出整行

?某頁面 某段時間 訪問次數
 cat access_log |grep '/yunshu.php?r=register/index' |awk '{if($4 ~"02/Nov/2016:15:") print $1}'| wc -l

?從日誌裡檢視該ip在幹嘛
#cat access_log | grep 218.66.36.119| awk '{print $1"\t"$7}' | sort | uniq -c | sort -nr | less

?列出傳輸時間超過 30 秒的檔案
#cat access_log|awk '($NF > 30){print $7}' |sort -n|uniq -c|sort -nr|head -20 
     NF表示最後一個域,當其大於30時 輸出第七欄位  (需要修改access 日誌記錄格式 增加 時間欄位)

?列出最最耗時的頁面(超過60秒的)
#cat access_log |awk  '($NF > 60 && $7~/\.php/){print $7}' |sort -n|uniq -c|sort -nr|head -100

?訪問次數最多的幾個分鐘
awk '{print  $4}' access_log  | cut -c 14-18 | sort|uniq -c | sort -nr | head
awk    首先將每條日誌中的訪問頁面抓出來      [29/Sep/2014:10:45:43
cut -c 14-18   再次將字串中 14-18值抓出          10:45
這裡再來演示一種分析日誌方法 日誌格式:
222.163.80.18 - - [06/Jun/2016:00:01:27 +0800] "GET http://www.iyunshu.com/ HTTP/1.1" 200 62341 "-" "Mozilla/5.0 (Macintosh; Intel Mac
     ip                           時間                             方法         URL                         協議    狀態 大小 來源      客戶端資訊
 OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36 JianKongBao Monitor 1.1" "NONE" "NONE"
攻擊類似 攻擊判定 apache 訪問日誌access_log 配置和解析 - 朝鮮程式設計師 - 朝鮮程式設計師的部落格    通過linux命令來過濾,把這個日誌檔案匯入到Linux系統下,然後
?檢視哪些ip訪問的多
zcat 檔名 |grep http://www.xxx.com | awk '{print $1}' | sort |uniq -c |sort -rn|head  ?查 某個IP對應的User-Agent
 zcat 檔名 |grep 網址|awk '{if($1~"66.249.64.243")print $0}' |awk -F \" '{print $6}'|sort|uniq -c|sort -rn|head  如果匹配第一個域 是 66.249.64.243 則輸出整行以“為分隔  輸出第六個域 二、配置訪問日誌
       
 apache中日誌記錄格式主要有兩種,普通型和複合型,安裝時預設使用common型別日誌記錄訪問資訊,
1. 配置訪問日誌格式主要有兩個引數   即LogFormat指令和CustomLog指令
  •  LogFormat指令 定義格式併為格式指定一個名字,以後我們就可以直接引用這個名字。
  • CustomLog指令 設定日誌檔案,並指明日誌檔案所用的格式(通常通過格式的名字)。
      2.  在apache的配置檔案httpd.conf中,有幾行是這麼配置的:

   LogFormat "%h %l %u %t "%r" %>s %b" common 定義格式 和 名字
  CustomLog "logs/access.log" common 使用此格式 存放位置(普通檔案記錄)

 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined定義格式 和 名字
 CustomLog   logs/access_log combined  使用此格式 存放位置(複合日誌記錄)

指定了日誌的目錄路徑./logs/,指定了日誌的格式,預設common。

common格式是通過:LogFormat "%h %l %u %t \"%r\" %>s %b"   定義的。
        %h %l %u %t \"%r\" %>s %b   
        遠端主機 遠端登入名 遠端使用者名稱 時間 請求第一行 狀態 傳送位元組

         combined格式通過:LogFormat  "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""定義的
         %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"
    遠端主機 遠端登入名 遠端使用者名稱 時間 請求第一行 狀態 傳送位元組 請求來源
    客戶端瀏覽器提供的瀏覽器識別資訊


    這裡看兩個例項
    common型記錄: 
             10.0.7.99 - - [31/May/2016:11:34:12 +0800] "GET / HTTP/1.1" 200 144
    combined型記錄:   
             10.0.7.99 - - [31/May/2016:14:33:30 +0800] "GET / HTTP/1.1" 200 144 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.6.2000 Chrome/30.0.1599.101 Safari/537.36"

common型記錄: 
      123.160.94.29 - - [03/Jun/2016:22:05:39 +0800] "GET /114/static/images/search/baidu.gif HTTP/1.1" 200 10383  combined型記錄: 
       123.160.94.29 - - [03/Jun/2016:22:05:39 +0800] "GET /114/static/images/search/baidu.gif HTTP/1.1" 200 10383 "http://120.76.121.147/114/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.9.2.1000 Chrome/39.0.2146.0 Safari/537.36" 這裡具體分析一下瀏覽器標識資訊:
User-Agent是Http協議中的一部分,屬於頭域的組成部分,User Agent也簡稱UA。用較為普通的一點來說,是一種向訪問網站提供你所使用的瀏覽器型別作業系統及版本、CPU 型別、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等資訊的標識。UA字串在每次瀏覽器 HTTP 請求時傳送到伺服器!
Mozilla/5.0   (Windows NT 6.1; WOW64)   AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.6.2000
                                                    64位作業系統                                                              
排版引擎      瀏覽器型別  Chrome/30.0.1599.101 Safari/537.36" Mozilla/5.0:  歷史太長,就是標識瀏覽器用的(多數瀏覽器都這樣標識自己,幾乎無意義)
(Windows NT 6.1; WOW64):
 Windows NT 6.1 對應作業系統windows 7   Windows NT 6.0 對應作業系統 windows vista
   Windows NT 5.2 對應作業系統 windows 2003  
   Windows NT 5.1 對應作業系統 windows xp
   Windows NT 5.0 對應作業系統 windows 2000

雙引號裡面的格式字串代表特定的資訊。

        apache格式字串及其含義:
        有時候我們只想在日誌中記錄某些特定的、已定義的資訊,這時就要用到“…”。如果在“%”和變數之間放入了一個或者多個HTTP狀態程式碼,則只有當請 求返回的狀態程式碼屬於指定的狀態程式碼之一時,變數所代表的內容才會被記錄。例如,如果我們想要記錄的是網站的所有無效連結,那麼可以使用:

LogFormat %404{Referer}i BrokenLinks
反之,如果我們想要記錄那些狀態程式碼不等於指定值的請求,只需加入一個“!”符號即可:
LogFormat %!200U SomethingWrong

符號解析:
%%    百分號(Apache2.0.44或更高的版本)

%a    遠端IP地址
%A    本機IP地址
%B    除HTTP頭以外傳送的位元組數
%b    以CLF格式顯示的除HTTP頭以外傳送的位元組數,也就是當沒有位元組傳送時顯示'-'而不是0。
%{Foobar}C    在請求中傳送給服務端的cookieFoobar的內容。
%D    伺服器處理本請求所用時間,以微為單位。
%{FOOBAR}e    環境變數FOOBAR的值
%f    檔名
%h    遠端主機
%H    請求使用的協議
%{Foobar}i    傳送到伺服器的請求頭Foobar:的內容。
%l    遠端登入名(由identd而來,如果支援的話),除非IdentityCheck設為"On",否則將得到一個"-"。
%m    請求的方法
%{Foobar}n    來自另一個模組的註解Foobar的內容。
%{Foobar}o    應答頭Foobar:的內容。
%p    伺服器服務於該請求的標準埠。
%P    為本請求提供服務的子程序的PID。
%{format}P 服務於該請求的PID或TID(執行緒ID),format的取值範圍為:pid和tid(2.0.46及以後版本)以及hextid(需要APR1.2.0及以上版本)
%q    查詢字串(若存在則由一個"?"引導,否則返回空串)
%r    請求的第一行
%s    狀態。對於內部重定向的請求,這個狀態指的是原始請求的狀態,---%>s則指的是最後請求的狀態。
%t    時間,用普通日誌時間格式(標準英語格式)
%{format}t    時間,用strftime(3)指定的格式表示的時間。(預設情況下按本地化格式)
%T    處理完請求所花時間,以秒為單位。
%u    遠端使用者名稱(根據驗證資訊而來;如果返回status(%s)為401,可能是假的)
%U    請求的URL路徑,不包含查詢字串。
%v    對該請求提供服務的標準ServerName。
%V    根據UseCanonicalName指令設定的伺服器名稱。
</span><span style="font-size:18px;">

CustomLog  logs/referer_log referer              也可以使用分開 來源與代理的格式來記錄

CustomLog  logs/agent_log agent

       可以簡單地在配置檔案中用多個CustomLog指令來建立多檔案訪問日誌。如下例,既記錄基本的CLF資訊,又記錄提交網頁和瀏覽器的資訊,最後兩行CustomLog示範瞭如何模擬ReferLog和AgentLog指令的效果。

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"