linux resin 查看日志命令,【转】linux:访问日志分析
作為一個(gè)程序員或項(xiàng)目負(fù)責(zé)人,甚至運(yùn)營人員,很多人都想知道:
* 我們的項(xiàng)目訪問量怎么樣
* 用戶訪問高峰在什么時(shí)候
* 系統(tǒng)變慢的時(shí)候用戶做了哪些操作
* 用戶對哪些功能比較感興趣
* 真實(shí)用戶在服務(wù)器上的操作軌跡是什么樣的
* 系統(tǒng)的瓶頸在哪
* 哪些地方應(yīng)該優(yōu)化
* 對什么地方優(yōu)化可以收益最大化
* 系統(tǒng)是否存在異常訪問
卻苦于無從獲得這些信息。
其實(shí),只要合理記錄并仔細(xì)分析服務(wù)器的訪問日志,上面問題都可以找到答案。
===== 日志格式定義 =====
為了更好的復(fù)用分析工具,另外我們也需要記錄一些標(biāo)準(zhǔn)日志中沒有的信息,因此需要定義用于分析的日志格式。
如果在項(xiàng)目中使用了多種web服務(wù)器,只需要根據(jù)具體情況定義一種即可。
從性能方便考慮,在apache或nginx上記錄日志較好;
從分析的方便程度來說,tomcat或resin更方便一些(因?yàn)橐话銇碚f,只有動(dòng)態(tài)請求會(huì)到達(dá)應(yīng)用服務(wù)器,而這些請求也是我們最感興趣的)。請大家根據(jù)自身項(xiàng)目的情況來選擇.
==== 基本格式 ====
我們分析的access log格式如下:
執(zhí)行時(shí)間 用戶標(biāo)識(shí)(非必需,可以從cookie或session中獲得) 遠(yuǎn)程主機(jī) 請求時(shí)間 請求url(是否帶參數(shù)均可)
http響應(yīng)狀態(tài) 返回字節(jié)數(shù)
:!:
各種服務(wù)器記錄執(zhí)行時(shí)間的單位有所不同,tomcat和nginx為毫秒,resin和apache為微秒,這個(gè)需要特別注意。
==== apache日志配置 ====
LogFormat "%D %{xxx}C %h %t \"%r\" %>s %b \"%{Referer}i\""
simple
CustomLog logs/access_log simple
%D為服務(wù)器處理該請求的時(shí)間,單位為微秒。
%{xxx}C,從cookie中取名為xxx的cookie值
==== nginx日志配置 ====
log_format simple '$request_time $cookie_xxx $remote_addr
[$time_local]'
'"$request" $status $body_bytes_sent '
'"$http_referer"';
$request_time為服務(wù)器處理該請求的時(shí)間,單位為毫秒。
$cookie_xxx,從cookie中取名為xxx的cookie值
==== tomcat日志配置 ====
prefix="localhost_access_log." suffix=".txt" pattern='%D %{xxx}s %h
%t "%r" %s %b %{Referer}i' resolveHosts="false"/>
%D為服務(wù)器處理該請求的時(shí)間,單位為毫秒。
%{xxx}s 從session中取得變量xxx的值
%{xxx}c 從cookie 中取得變量xxx的值
==== resin日志配置 ====
format='%D %{xxx}c %h %t "%r" %s %b
"%{Referer}i"'?rollover-period="1D"/>
%D為服務(wù)器處理該請求的時(shí)間,單位為微秒。
%{xxx}c,從cookie中取名為xxx的cookie值
resin日志默認(rèn)的寫法在某些特定情況下會(huì)存在嚴(yán)重性能問題,導(dǎo)致所有線程被鎖,服務(wù)器失去響應(yīng)。因此請用上面配置完全替換原有配置。resin日志格式的詳細(xì)說明,請參考http://caucho.com/resin-4.0/admin/logging.xtp#Access
logging?。
==== 獲得多次轉(zhuǎn)發(fā)的客戶端IP ====
在生產(chǎn)環(huán)境中,一般到應(yīng)用服務(wù)器的時(shí)候,已經(jīng)經(jīng)過了多次轉(zhuǎn)發(fā),如array-->apache(nginx)-->tomcat(resin),這個(gè)時(shí)候,如果我們想要在access
log中獲得用戶客戶端的原始IP,就需要做一些特殊配置。
nginx在進(jìn)行轉(zhuǎn)發(fā)時(shí),一般會(huì)設(shè)置
proxy_set_header?X-Real-IP?$remote_addr;
此時(shí),nginx后面的服務(wù)器在配置access log時(shí),需要將%h改為%{X-Real-IP}i
array,apache,squid在轉(zhuǎn)發(fā)時(shí),一般都會(huì)將客戶端真實(shí)ip放到header中X-Forwarded-For,那么,他們后面的服務(wù)器在配置access
log時(shí),需要將%h改為%{X-Forwarded-For}i
nginx作為backend server時(shí),跟上面情形有所不同,需要做一些特殊配置:
首先,編譯時(shí)需要添加一個(gè)參數(shù) --with-http_realip_module
然后,需要做如下設(shè)置:
設(shè)置信任ip列表,也就是負(fù)載均衡設(shè)備的ip,可以是一個(gè)或多個(gè)。然后設(shè)置保存客戶端真實(shí)IP的header變量名,一般是X-Real-IP或X-Forwarded-For,如下
set_real_ip_from?192.168.1.0/24;
set_real_ip_from?192.168.2.1;
real_ip_header?X-Real-IP;
===== 概要分析腳本 timeout.awk =====
#對于請求超時(shí)的記錄進(jìn)行標(biāo)記,并打印出來
#!/bin/sh
BEGIN{
#基礎(chǔ)單位,tomcat/apache為1設(shè)為1,resin/nginx/設(shè)為1000.
base=1
#超時(shí)閥值,建議設(shè)為300-500,單位為毫秒
valve=500
}
#剔除靜態(tài)文件請求
$7 ~ /\.[jd][hsw][ptr][m]?[l]?[\b\?]?|^\/dwr/ {
#總體統(tǒng)計(jì)
costTime=$1/base
sumTime+=costTime
totalCount++
if(min>costTime) min=costTime
if(max
#分布區(qū)間
if(costTime>=0 && costTime<1000)
{area01+=1}
if(costTime>=1000 && costTime<2000)
{area12+=1}
if(costTime>=2000 && costTime<3000)
{area23+=1}
if(costTime>=3000 && costTime<4000)
{area34+=1}
if(costTime>=4000 && costTime<5000)
{area45+=1}
if(costTime>=5000) {area50+=1}
#超時(shí)統(tǒng)計(jì)
pos=index($7,"?")
if(pos>0) {url=substr($7,0,pos-1)}
else { url=$7 }
urlCount[url]++
urlsumTime[url]+=costTime
if(costTime>valve)
{ urlTimeout[url]++ }
}
END{
printf("\n當(dāng)前正在分析文件%s,共處理%s個(gè)請求,響應(yīng)時(shí)間最小為-ms,最大為�ms,平均Mms\n",FILENAME,totalCount,min,max,sumTime/totalCount)
printf("\n所有請求的分布區(qū)間如下:\n")
printf("小于1秒的請求�個(gè),占%.2f%\n",area01,area01/totalCount*100)
printf("1--2秒的請求�個(gè),占%.2f%\n",area12,area12/totalCount*100)
printf("2--3秒的請求�個(gè),占%.2f%\n",area23,area23/totalCount*100)
printf("3--4秒的請求�個(gè),占%.2f%\n",area34,area34/totalCount*100)
printf("4--5秒的請求�個(gè),占%.2f%\n",area45,area45/totalCount*100)
printf("大于5秒的請求�個(gè),占%.2f%\n",area50,area50/totalCount*100)
printf("\n下面是請求超時(shí)嚴(yán)重的url列表,需要重點(diǎn)優(yōu)化,當(dāng)前超時(shí)設(shè)定為]ms\n",valve)
for(url in urlTimeout)?{
#超時(shí)小于等于3次,或者超時(shí)比例20%以下的不輸出
if(urlTimeout[url]>3 &&
(urlTimeout[url]/urlCount[url]>0.2)) {
printf("%-80s共處理]次,超時(shí)]次,占%3.2f%,平均耗時(shí)mms\n",url,urlCount[url],urlTimeout[url],urlTimeout[url]/urlCount[url]*100,urlsumTime[url]/urlCount[url])
}
}
}
===== 概要分析腳本 timeout.awk =====
用于生成一個(gè)日志分析概覽,可以對當(dāng)前系統(tǒng)的性能有個(gè)大概了解,分析結(jié)果樣式如下:
執(zhí)行命令
awk -f timeout.awk valve=200 base=1 datafile
其中,valve為超時(shí)的閥值,默認(rèn)500ms,base根據(jù)服務(wù)器類型,tomcat/apache為1,resin/nginx為1000;
這個(gè)腳本僅分析jsp/jhtml/dwr請求,不統(tǒng)計(jì)對靜態(tài)資源的請求。
===== 分析命令 =====
下面在分析核心爆破英語項(xiàng)目時(shí),一些我常用的分析命令,等有時(shí)間了再整理為一個(gè)工具,也歡迎大家貢獻(xiàn)自己的想法。
下面命令僅適用于tomcat和nginx日志,如果是apache或resin日志,請將$1>10替換為$1>10000,這個(gè)條件主要用于過濾靜態(tài)請求。
cost time 10 大 url
awk '$1>10 {print $0}' localhost_access_log.2010-05-21.txt |awk
'{print $7}'|awk -F? '{print $1}'|sort|uniq -c|sort -rbg|sed
10q
訪問量10大時(shí)間點(diǎn)(分鐘)
awk '$1>10 {print $0}' localhost_access_log.2010-05-21.txt |awk
'{print $4}'|awk -F: '{print $2":"$3}'|sort|uniq -c|sort -rbg|sed
10q
10大ip (訪問量最大)
awk '$1>10 {print $0}' localhost_access_log.2010-05-21.txt|awk
'{print $3}'|sort|uniq -c|sort -rbg|sed 10q
url時(shí)間點(diǎn)分布 (指定URL 訪問量 按分鐘)
awk '$7~"startLinker.jhtml" {print $0}'
localhost_access_log.2010-05-21.txt |awk '{print $4}'|awk -F:
'{print $2":"$3}'|uniq -c
指定ip時(shí)間點(diǎn)分布 (指定IP 訪問量 按分鐘)
awk '$1>10 {print $0}' localhost_access_log.2010-05-21.txt |grep
'192.168.30.21\b' |awk '{print $4}'|awk -F: '{print $2":"$3}'|uniq
-c
指定時(shí)間點(diǎn)url分布 (具體某一分鐘)
awk '$1>10 {print $0}' localhost_access_log.2010-05-21.txt|grep
'12:45'|awk '{print $7}'|awk -F? '{print $1}'|sort|uniq -c|sort
-bg
根據(jù)用戶名查找登錄過的ip
awk '{print $2" "$3}' localhost_access_log.2010-05-21.txt |grep
's01o050'|awk '{print $2}'|sort|uniq
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的linux resin 查看日志命令,【转】linux:访问日志分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式linux python移植过程_
- 下一篇: pdo 错误 php,多语句查询中的PH