【Apache運維基礎(6)】Apache的日誌管理與分析

簡述

Apache 訪問日誌在實際工做中很是有用,比較典型的例子是進行網站流量統計,查看用戶訪問時間、地理位置分佈、頁面點擊率等。Apache 的訪問日誌具備以下4個方面的做用:html

  1. 記錄訪問服務器的遠程主機IP 地址,從而能夠得知瀏覽者來自何處;
  2. 記錄瀏覽者訪問的Web資源,能夠了解網站中的哪些部分最受歡迎;
  3. 記錄瀏覽者使用的瀏覽器,能夠根據大多數瀏覽者使用的瀏覽器對站點進行優化;
  4. 記錄瀏覽者的訪問時間;

配置

定製日誌文件的格式涉及到兩個指令,即LogFormat指令和CustomLog指令,默認httpd.conf文件提供了關於這兩個指令的幾個示例。
LogFormat指令定義格式併爲格式指定一個名字,之後咱們就能夠直接引用這個名字。CustomLog指令設置日誌文件,並指明日誌文件所用的格式(一般經過格式的名字)。
LogFormat指令的功能是定義日誌格式併爲它指定一個名字。例如,在默認的httpd.conf文件中,咱們能夠找到下面這行代碼:linux

LogFormat "%h %l %u %t "%r" %>s %b" common

該指令建立了一種名爲「common」的日誌格式,日誌的格式在雙引號包圍的內容中指定。格式字符串中的每個變量表明着一項特定的信息,這些信息按照格式串規定的次序寫入到日誌文件。
Apache文檔已經給出了全部可用於格式串的變量及其含義,下面是其譯文:web

%% 百分號(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指令設定的服務器名稱。
%X 請求完成時的鏈接狀態:
X= 鏈接在應答完成前中斷。
+= 應答傳送完後繼續保持鏈接。
-= 應答傳送完後關閉鏈接。
(在1.3之後的版本中,這個指令是%c,但這樣就和過去的SSL語法:%{var}c衝突了)
%I 接收的字節數,包括請求頭的數據,而且不能爲零。要使用這個指令你必須啓用mod_logio模塊。
%O 發送的字節數,包括請求頭的數據,而且不能爲零。要使用這個指令你必須啓用mod_logio模塊。

常見的日誌格式舉例

通用日誌格式(CLF)apache

「%h %l %u %t \」%r\」 %>s %b」

帶虛擬主機的通用日誌格式瀏覽器

「%v %h %l %u %t \」%r\」 %>s %b」

NCSA擴展/組合日誌格式服務器

「%h %l %u %t \」%r\」 %>s %b \」%{Referer}i\」 \」%{User-agent}i\」"

Referer日誌格式cookie

「%{Referer}i -> %U」

Agent(Browser)日誌格式dom

「%{User-agent}i」

apache配置實例格式:ide

LogFormat "%h %l %u %t %T \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>

按時間分配記錄

對於大訪問量的網站,日誌不可能只記錄在一個文件裏面,1萬日誌大概就有50M,還有一個可能就是你要跟蹤用戶的行爲,可能須要一些額外的信息,怎麼把這些東西記錄到apache日誌裏面。apache提供了很出色的日誌配置方式,具體的配置能夠參考:http://httpd.apache.org/docs/... 我這裏只是簡單的舉一些例子。優化

實現按照小時記錄日誌

apache 自帶有一個rotatelogs 能夠實現這個功能,查看一下他的help就知道使用的方法了。

Usage: rotatelogs [-l] <logfile> {<rotation time in seconds>|<rotation size in megabytes>} [offset minutes from UTC]

先看下面的例子:

<VirtualHost *:80>
    ServerAdmin webmaster@myhost.com
    DocumentRoot /home/web/www
    ServerName myhost.com
<Directory "/home/web/www">
    Options Indexes FollowSymLinks
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>
CustomLog "|bin/rotatelogs logs/myhost_access_log_%Y_%m_%d_%H.log 3600 480" common
</VirtualHost>

logs/pma_access_log_%Y_%m_%d_%H.log 是文件名字,能夠用佔位符。
3600 表示的是每一個小時記錄一次,這個單位是s
480 表示和UTC時間差的分鐘數目,咱們是東八區要比他們早480分鐘。

在日誌中記錄cookie

我要記錄一個用戶的客戶端的信息,而且每次用戶訪問,我都自動在瀏覽器裏面寫一個cookie,及時發現惡意攻擊或者用於廣告系統中防止做弊。
首先啓用apache 自帶的user track 把 LoadModule usertrack_module modules/mod_usertrack.so前面的#去掉。
linux用戶的話,沒有這個模塊,那麼就從新編譯一下。

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.domain
    DocumentRoot D:/web/htdocs
    ServerName localhost.com
    CookieTracking on
    CookieDomain .localhost.com
    CookieExpires "1 days"
    CookieStyle Cookie
<Directory "D:/web/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{Cookie}i\"" mylogconfig
CustomLog "|bin/rotatelogs logs/pma_access_log_%Y_%m_%d_%H.log 3600 480" mylogconfig
</VirtualHost>

CookieTracking on
CookieDomain .localhost.com
CookieExpires "1 days"
CookieStyle Cookie
這四句是設置cookie的屬性的。

這一句是設置日誌的屬性:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{Cookie}i\"" mylogconfig

日誌的名字叫作mylogconfig。

相關文章
相關標籤/搜索