1. 程式人生 > >apache與nginx日誌檔案詳解

apache與nginx日誌檔案詳解


**apache
預設裝的apache,它的日誌檔案放在 /usr/local/apache/logs。access.log
cat /usr/local/apache/logs。access.log
示例:
192.168.4.228 - - [27/Sep/2018:23:15:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-"

 192.168.4.228  遠端主機的地址 (用nslookup工具查詢DNS可以找出主機名) 
======================
- 記錄瀏覽者唯一識別符號
=====================
- 記錄瀏覽者進行身份驗證時提供的名字
====================================================
[27/Sep/2018:23:15:59 +0800]  代表2018年9月27號23點15分59秒   +0800代表伺服器所處時區位於UTC之後的8小時
===============================================================================================
"GET / HTTP/1.1"   算是比較重要的一個資訊。 格式為"METHOD RESOURCE PROTOCOL"即"方法 資源 協議"。
請求的方法(常見的還有POST,HEAD ), / 代表瀏覽者訪問網頁或根, HTTP/1.1 代表Web客戶使用的版本
=============================================================================================
304   狀態碼 403以上為錯誤,一下邏輯上不算錯誤
==============================================
0      代表向客戶傳送了多少位元組數(總的量),可以看出傳輸是否被打斷,以及伺服器在一段時間內傳送了多少資料(一天一週,月)
=========================================================================================================
"-"  代表客戶提出請求時他所在的目錄或者URL
=========================================

appache的主程式httpd的配置檔案 vim /etc/httpd/conf/httpd.conf 中與設定日誌相關的有兩個
一個是LogFormat和CustonLog
LogFile是定義日誌排列格式,並給這個排列指一個名字
CustomLog 設定日誌檔案用什麼格式 比如 access.log

比如:LogFormat "%h %l %u %t \"%r\" %>s %b" common
名字是common 的日誌 ,格式內容有 
遠端主機,遠端登入名字,遠端使用者,請求時間,請求的第一 行程式碼,請求狀態,以及傳送的位元組數

-----------------------------------------------------

格式的含義如下:
%...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 查詢字串(如果存在查詢字串,則包含“?”後面的部分;否則,它是一個空字串。)
%...r: 請求的第一行
%...s: 狀態。對於進行內部重定向的請求,這是指*原來*請求 的狀態。如果用%...>s,則是指後來的請求。
%...t: 以公共日誌時間格式表示的時間(或稱為標準英文格式)
%...{format}t: 以指定格式format表示的時間
%...T: 為響應請求而耗費的時間,以秒計
%...u: 遠端使用者(來自auth;如果返回狀態(%s)是401則可能是偽造的)
%...U: 使用者所請求的URL路徑
%...v: 響應請求的伺服器的ServerName
%...V: 依照UseCanonicalName設定得到的伺服器名字

注:
“...”表示自定義新增的條件,比如你價格狀態碼或多個,那麼只有請求返回的狀態是你自定義的內容狀態碼時才會記錄成日誌
如: %404{Referer}i BrokenLinks


---------------------


 
 
 
**nginx日誌
在nginx配置檔案裡
vim /usr/local/nginx/conf/nginx.conf的日誌格式主要與log_format和access_log搭邊(自定義也是這兩條)

***
log_format 用來設定日誌的格式, log_format具體格式:log_format 格式名 '日誌格式樣式'(注意要用單引號括起來。引號裡可以有多個日誌格式引數)

例如: log_format combined '$remote_addr-$remote_user [$time_local]'       combined為格式名   後面的為日誌格式樣式 

想自定義nginx日誌格式直接在配置檔案加變數即可 !

nginx是怎麼實現以日誌的形式記錄客戶端的IP的?? 現在可以在ngixn主配置中的日誌格式log_format中的$remote_addr變數,它雖然是可以拿到客戶ip,但如果是有反向代理在中間的話它只能拿到反響代理伺服器的ip,而拿不到客戶伺服器的真實ip!!! 所以這時候需要X-Forwarded-For ,當客戶端傳送請求給我們伺服器的時候,反向代理伺服器會轉發客戶端的HTTP頭資訊,在這個過程中,方向代理伺服器會記錄客戶端的真實ip和客戶端所請求伺服器的ip,每記錄一次它都會把資訊存在X-Forwarded-For中。具體 格式如下:
X-Forwarded-For:client, proxy1, proxy2 (假設客戶端要通過多個代理伺服器才能把請求發給伺服器)
當client請求發給proxy1時候,客戶端的ip以及所請求的伺服器ip會記錄在X-Forwarded-For裡,然後proxy1會轉發client的ip給porxy2,這個過程的ip也會存在XFF裡面(追加的形式)。

首先 $remote_addr變數拿到的是反向代理伺服器的IP地址,反向代理伺服器在轉發請求的HTTP頭資訊中,可以增加X-Forwarded-For資訊,所以用日誌記錄X-Forearded-For資訊中的客戶端IP地址就是真實地址!!!
配置檔案書寫格式:'$http_x_forwarded_for_$remote_user [$time_local]' 不僅僅取到了客戶ip地址,還給它顯示名字已經客戶端的時間時區。

    log_format  main  '$remote_addr  $remote_user [$time_local] "$request" '             #預設的日誌格式
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for_$remote_user [$time_local]"';

    access_log  /data/logs/access.log  main;    #開啟訪問日誌功能用來指定日誌檔案的存放路徑、格式和快取大小                                        
$remote_addr      用於記錄IP地址
$remote_user      用於記錄遠端客戶端使用者名稱稱;
$time_local       用於記錄訪問時間與時區;
$request          用於記錄請求URL與HTTP協議;
$status           用於記錄請求狀態,例如成功時狀態為200,頁面找不到時狀態為404;
$body_bytes_sent  用於記錄傳送客戶端的檔案主體內容大小;
$http_referer     用於記錄是從哪個頁面連結訪問過來的;
$http_user_agent  用於記錄客戶瀏覽器的相關資訊。    
    
    
***
 access_log  指定日誌路徑,快取大小和日誌檔名
如:    access_log  /data/logs/access.log  main;


192.168.4.228 - - [27/Sep/2018:23:15:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-"    
    
    
客戶端地址、伺服器地址、伺服器主機名、訪問時間和時區、請求方式、請求協議、狀態碼、檔案大小、瀏覽器資訊

    
    
    
    
**
nginx變數如下    
    
變數                      說明                                         示例
$remote_addr             客戶端地址                                    211.28.65.253
$remote_user             客戶端使用者名稱稱                                --
$time_local              訪問時間和時區                                18/Jul/2012:17:00:01 +0800
$request                 請求的URI和HTTP協議                           "GET /article-10000.html HTTP/1.1"
$http_host               請求地址,即瀏覽器中你輸入的地址(IP或域名)     www.wang.com 192.168.100.100
$status                  HTTP請求狀態                                  200
$upstream_status         upstream狀態                                  200
$body_bytes_sent         傳送給客戶端檔案內容大小                        1547
$http_referer            url跳轉來源                                   https://www.baidu.com/
$http_user_agent         使用者終端瀏覽器等資訊                           "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$ssl_protocol            SSL協議版本                                   TLSv1
$ssl_cipher              交換資料中的演算法                               RC4-SHA
$upstream_addr           後臺upstream的地址,即真正提供服務的主機地址     10.10.10.100:80
$request_time            整個請求的總時間                               0.205
$upstream_response_time  請求過程中,upstream響應時間                    0.002