## 簡述
Apache 訪問日志在實際工作中非常有用,比較典型的例子是進行網站流量統計,查看用戶訪問時間、地理位置分布、頁面點擊率等。Apache 的訪問日志具有如下4個方面的作用:
1. 記錄訪問服務器的遠程主機IP 地址,從而可以得知瀏覽者來自何處;
2. 記錄瀏覽者訪問的Web資源,可以了解網站中的哪些部分最受歡迎;
3. 記錄瀏覽者使用的瀏覽器,可以根據大多數瀏覽者使用的瀏覽器對站點進行優化;
4. 記錄瀏覽者的訪問時間;
## 配置
定制日志文件的格式涉及到兩個指令,即LogFormat指令和CustomLog指令,默認httpd.conf文件提供了關于這兩個指令的幾個示例。
LogFormat指令定義格式并為格式指定一個名字,以后我們就可以直接引用這個名字。CustomLog指令設置日志文件,并指明日志文件所用的格式(通常通過格式的名字)。
LogFormat指令的功能是定義日志格式并為它指定一個名字。例如,在默認的httpd.conf文件中,我們可以找到下面這行代碼:
LogFormat "%h %l %u %t "%r" %>s %b" common
該指令創建了一種名為“common”的日志格式,日志的格式在雙引號包圍的內容中指定。格式字符串中的每一個變量代表著一項特定的信息,這些信息按照格式串規定的次序寫入到日志文件。
Apache文檔已經給出了所有可用于格式串的變量及其含義,下面是其譯文:
%% 百分號(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)
“%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日志格式
“%{Referer}i -> %U”
Agent(Browser)日志格式
“%{User-agent}i”
apache配置實例格式:
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/2.0/logs.html 我這里只是簡單的舉一些例子。
### 實現按照小時記錄日志
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。
- Apache
- 【Apache運維基礎(1)】Apache的安裝與使用
- 【Apache運維基礎(2)】主配置文件說明
- 【Apache運維基礎(3)】虛擬主機配置說明
- 【Apache運維基礎(4)】Apache的Rewrite攻略(1)
- 【Apache運維基礎(5)】Apache的Rewrite攻略(2).htaccess文件
- 【Apache運維基礎(6)】Apache的日志管理與分析
- 工具篇
- supervisor進程管理器
- Haproxy安裝與配置
- Nginx
- 【nginx網站性能優化篇(1)】gzip壓縮與expire瀏覽器緩存
- 【nginx網站性能優化篇(2)】反向代理實現Apache與Nginx的動靜分離(LNMPA)
- 【nginx網站性能優化篇(3)】反向代理實現負載均衡
- 【nginx網站性能優化篇(4)】理解nginx的高并發原理及其配置調優
- 【nginx運維基礎(1)】Nginx的編譯安裝與使用
- 【nginx運維基礎(2)】Nginx的配置文件說明及虛擬主機配置示例
- 【nginx運維基礎(3)】Nginx的編譯PHP
- 【nginx運維基礎(4)】Nginx的日志管理(日志格式與定時分割日志)
- 【nginx運維基礎(5)】Nginx的location攻略
- 【nginx運維基礎(6)】Nginx的Rewrite語法詳解
- 【nginx運維基礎(7)】配置SSL支持https訪問
- 【nginx運維基礎(8)】配置支持http2協議
- 【nginx運維基礎(9)】了解PHP-FPM 與 Nginx 的通信機制
- 其它
- Apache與Nginx下php隱藏http頭部版本信息的實現方法
- CURL與PHP-CLI的應用【CLI篇】
- CURL與PHP-CLI的應用【Curl篇】
- Linux之SAMBA共享服務
- 【Linux常識篇(1)】所謂的正向代理與反向代理
- 【Linux常識篇(2)】理解inode
- 【Linux常識篇(3)】文件及文件夾的ctime atime mtime的含義詳解
- centOS使用手記
- 服務器日志分析
- 高頻命令
- df
- mv
- gzip
- cp
- tar
- touch
- cat
- uniq
- nl
- more
- rmdir
- less
- mkdir
- head
- rm
- tail
- 五大查詢命令
- vi&vim
- ls與目錄結構
- grep
- awk
- sed
- 其他高頻命令