日誌管理php
咱們觀察nginx的server段,能夠看到以下相似信息前端
#access_log logs/host.access.log main;nginx
這說明 該server, 它的訪問日誌的文件是 logs/host.access.log ,web
使用的格式」main」格式.shell
除了main格式,你能夠自定義其餘格式.瀏覽器
main格式是什麼?bash
log_format main '$remote_addr - $remote_user [$time_local] "$request" '服務器
# '$status $body_bytes_sent "$http_referer" 'ide
# '"$http_user_agent" "$http_x_forwarded_for"';google
(php獲取的客戶端ip等就是經過nginx傳過來的)
main格式是咱們定義好一種日誌的格式,並起個名字,便於引用.
以上面的例子, main類型的日誌,記錄的 remote_addr.... http_x_forwarded_for等選項.
1: 日誌格式 是指記錄哪些選項
默認的日誌格式: main
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
下面是log_format指令中經常使用的一些變量:
變量 |
含義 |
$bytes_sent |
發送給客戶端的總字節數 |
$body_bytes_sent |
發送給客戶端的字節數,不包括響應頭的大小 |
$connection |
鏈接序列號 |
$connection_requests |
當前經過鏈接發出的請求數量 |
$msec |
日誌寫入時間,單位爲秒,精度是毫秒 |
$pipe |
若是請求是經過http流水線發送,則其值爲"p",不然爲「." |
$request_length |
請求長度(包括請求行,請求頭和請求體) |
$request_time |
請求處理時長,單位爲秒,精度爲毫秒,從讀入客戶端的第一個字節開始,直到把最後一個字符發送張客戶端進行日誌寫入爲止 |
$status |
響應狀態碼 |
$time_iso8601 |
標準格式的本地時間,形如「2017-05-24T18:31:27+08:00」 |
$time_local |
通用日誌格式下的本地時間,如"24/May/2017:18:31:27 +0800" |
$http_referer |
請求的referer地址。 |
$http_user_agent |
客戶端瀏覽器信息。 |
$remote_addr |
客戶端IP |
$http_x_forwarded_for |
當前端有代理服務器時,設置web節點記錄客戶端地址的配置,此參數生效的前提是代理服務器也要進行相關的x_forwarded_for設置。 |
$request |
完整的原始請求行,如 "GET / HTTP/1.1"、POST等 |
$remote_user |
客戶端用戶名稱,針對啓用了用戶認證的請求 |
$request_uri |
完整的請求地址 |
如淘寶屏蔽的爬蟲(道德規範):
(若是在nginx日誌裏發現了百度、google等的爬蟲的訪問,恭喜)
如默認的main日誌格式,記錄這麼幾項
遠程IP- 遠程用戶/用戶時間 請求方法(如GET/POST) 請求體body長度 referer來源信息
http-user-agent用戶代理/蜘蛛 ,被轉發的請求的原始IP
http_x_forwarded_for:在通過代理時,代理把你的原本IP加在此頭信息中,傳輸你的原始IP
2: 聲明一個獨特的log_format並命名
log_format mylog '$remote_addr- "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
在下面的server/location,咱們就能夠引用 mylog(一般默認有個main)
在server段中,這樣來聲明
Nginx容許針對不一樣的server作不一樣的Log ,(有的web服務器不支持,如lighttp)
access_log logs/access_8080.log mylog;
聲明log log位置 log格式;
實際應用: shell+定時任務+nginx信號管理,完成日誌按日期存儲
分析思路:
凌晨00:00:01,把昨天的日誌重命名,放在相應的目錄下
再USR1信息號控制nginx從新生成新的日誌文件
具體腳本:
#!/bin/bash
base_path='/usr/local/nginx/logs'
log_path=$(date -d yesterday +"%Y%m")
day=$(date -d yesterday +"%d")
mkdir -p $base_path/$log_path
mv $base_path/access.log $base_path/$log_path/access_$day.log
#echo $base_path/$log_path/access_$day.log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
定時任務
Crontab 編輯定時任務
01 00 * * * /xxx/path/b.sh 天天0時1分(建議在02-04點之間,系統負載小)