在一個成熟的WEB系統(tǒng)里,沒有日志管理是不可以的,有了日志,可以幫助你得到用戶地域來源、跳轉(zhuǎn)來源、使用終端、某個URL訪問量等相關(guān)信息;通過錯誤日志,你可以得到系統(tǒng)某個服務(wù)或server的性能瓶頸等。因此,將日志好好利用,你可以得到很多有價值的信息。
日志格式及定義
(1)log_format
log_format用來設(shè)置日志格式,也就是日志文件中每條日志的格式,具體如下:
log_format name(格式名稱) type(格式樣式)
log_format main ‘$server_name $remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $uptream_status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for” ‘
‘$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time’;
參數(shù)說明:
$server_name:虛擬主機名稱。
$remote_addr:遠(yuǎn)程客戶端的IP地址。
-:空白,用一個“-”占位符替代,歷史原因?qū)е逻€存在。
$remote_user:遠(yuǎn)程客戶端用戶名稱,用于記錄瀏覽者進行身份驗證時提供的名字,如登錄百度的用戶名scq2099yt,如果沒有登錄就是空白。
[$time_local]:訪問的時間與時區(qū),比如18/Jul/2012:17:00:01 +0800,時間信息最后的”+0800″表示服務(wù)器所處時區(qū)位于UTC之后的8小時。
$request:請求的URI和HTTP協(xié)議,這是整個PV日志記錄中最有用的信息,記錄服務(wù)器收到一個什么樣的請求
$status:記錄請求返回的http狀態(tài)碼,比如成功是200。
$uptream_status:upstream狀態(tài),比如成功是200.
$body_bytes_sent:發(fā)送給客戶端的文件主體內(nèi)容的大小,比如899,可以將日志每條記錄中的這個值累加起來以粗略估計服務(wù)器吞吐量。
$http_referer:記錄從哪個頁面鏈接訪問過來的。
$http_user_agent:客戶端瀏覽器信息
$http_x_forwarded_for:客戶端的真實ip,通常web服務(wù)器放在反向代理的后面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿到的IP地址是反向代理服務(wù)器的iP地址。反向代理服務(wù)器在轉(zhuǎn)發(fā)請求的http頭信息中,可以增加x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務(wù)器地址。
$ssl_protocol:SSL協(xié)議版本,比如TLSv1。
$ssl_cipher:交換數(shù)據(jù)中的算法,比如RC4-SHA。
$upstream_addr:upstream的地址,即真正提供服務(wù)的主機地址。
$request_time:整個請求的總時間。
$upstream_response_time:請求過程中,upstream的響應(yīng)時間。
(2)access_log
access_log指令用來指定日志文件的存放路徑(包含日志文件名)、格式和緩存大小,具體如下:
access_log path(存放路徑) [format(自定義日志格式名稱) [buffer=size | off]]
舉例說明如下:
access_log logs/access.log main;
如果想關(guān)閉日志,可以如下:
access_log off;
能夠使用access_log指令的字段包括:http、server、location。
需要注意的是:Nginx進程設(shè)置的用戶和組必須對日志路徑有創(chuàng)建文件的權(quán)限,否則,會報錯。
小技巧:如果需要在access_log中記錄post請求的參數(shù),可以參考這里。
Nginx支持為每個location指定強大的日志記錄。同樣的連接可以在同一時間輸出到不止一個的日志中,更多信息請查看這里,這里,還有這里。
下面拿我本地的虛擬機來簡單配置一下日志,并獲取日志信息。
日志生成的到Nginx根目錄logs/access.log文件,默認(rèn)使用“main”日志格式,也可以自定義格式。
在Nginx下配置的虛擬主機
server {
listen 80;
server_name mytest.com;
location / {
root /data/wwwroot/default/mytest; //網(wǎng)站目錄
index index.html;
}
access_log /data/wwwlogs/mytest_log/access_nginx.log main; //日志路徑
當(dāng)然也可以配置錯誤日志路徑error_log……
}
Nginx主配置文件的配置規(guī)則
http {
include mime.types;
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “http_referer” ‘
‘ “$http_user_agent” “$http_x_forwarded_for” ‘;
……
}
記得配置完成先命令測試下是否OK,然后在重新加載配置文件
[root@localhost mytest_log]# nginx -tc /usr/local/nginx/conf/nginx.conf
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
下面來說一下定時切割(雖然新版的Nginx已經(jīng)支持)
根據(jù)上面的配置,確定了日志路徑之后,我在/data/crontab目錄下創(chuàng)建了一個腳本
#!/bin/bash
LOGPATH=/data/wwwlogs/mytest_log/access_nginx.log //nginx的日志路徑
BAKPATH=/data/wwwlogs/bak //要備份的路徑
bak=$BAKPATH/$(date -d yesterday +%Y%m%d%H%M).mytest.access.log //定義了的bak變量
echo $bak //執(zhí)行輸出一下
[root@localhost crontab]# chmod 777 nginx_log.sh //賦權(quán)限
[root@localhost crontab]# ./nginx_log.sh //執(zhí)行腳本
/data/wwwlogs/bak/201801101205.mytest.access.log //輸出的格式
完整腳本如下
#!/bin/bash
#設(shè)置日志文件存放目錄
LOGPATH=/data/wwwlogs/mytest_log/access_nginx.log
BAKPATH=/data/wwwlogs/bak
#備分文件名稱
bak=$BAKPATH/$(date -d yesterday +%Y%m%d%H%M).mytest.access.log
#echo $bak
#重命名日志文件
mv $LOGPATH $bak
touch $LOGPATH
#向nginx主進程發(fā)信號重新打開日志,確保nginx.pid路徑正確
#[root@localhost wwwlogs]# find / -name nginx.pid
#/var/run/nginx.pid
kill -USR1 `cat /var/run/nginx.pid`
然后創(chuàng)建定時器
關(guān)于定時器詳細(xì)的講解在 http://www.sfodin.cn/Linux/2019-03/157851.htm 下
01 00 * * * /data/crontab/nginx_log.sh # 每天0時1分(建議在02-04點之間,系統(tǒng)負(fù)載小)
查看一下/data/wwwlogs/bak就會有日志文件了