tomcat默認(rèn)access log日志格式為 pattern="%h %l %u %t "%r" %s %b"
%h 遠(yuǎn)程的主機(jī)名或IP
%l 遠(yuǎn)程的邏輯用戶名
%u 通過身份驗證的遠(yuǎn)程用戶
%t 通用日志格式的日期和時間
%r 請求
%s 返回的HTTP狀態(tài)碼
%b 響應(yīng)中發(fā)送的字節(jié),不包括HTTP頭
我定制的格式為
pattern="%h %l %u %t "%r" %s %b %D "%{User-Agent}i""
增加了請求處理時間,以及user agent
按時間段過濾日志
awk '($4>="[21/Feb/2020:22:00:00]" && $4<="[21/Feb/2020:22:00:10]"){print $0}' localhost_access_log.2020-02-21.txt
awk '($4>="[02/Mar/2020:08:00:00]" && $4<="[02/Mar/2020:08:30:00]"){print $0}' localhost_access_log.2020-03-02.txt
按照訪問url進(jìn)行統(tǒng)計,并列出前20條
awk -F\" '{print $2}' localhost_access_log.2020-02-20.txt | sort | uniq -c | sort -nr | head -20
上面這樣統(tǒng)計,會把同一個url,?后面參數(shù)不同視為2個不同的訪問而分開統(tǒng)計訪問次數(shù)。如果要忽略url ?之后的參數(shù)差異,可以修改為
awk -F\" '{print $2}' localhost_access_log.2020-02-20.txt | awk -F\? '{printf $1 "\n"}' | sort | uniq -c | sort -nr | head -20
這樣寫法,仍然可能有bug,例如
GET /login.do HTTP/1.1
與
GET /login.do?a=a HTTP/1.1
被看成2條不同記錄了,因為沒有?的url沒法切割。改進(jìn)的寫法為
awk -F\" '{print $2}' localhost_access_log.2020-02-20.txt | awk -F "[? ]" '{printf $2 "\n"}' | sort | uniq -c | sort -nr | head -20
找出非200的請求
awk '($9!=200 && $9!=302){print $0}' localhost_access_log.2020-02-21.txt
統(tǒng)計訪問ip數(shù)
awk '{print $1}' localhost_access_log.2020-02-21.txt | sort | uniq | wc -l
一個稍微復(fù)雜一點的統(tǒng)計,統(tǒng)計某品牌用戶數(shù)量
cat localhost_access_log.2020-03-02.txt | grep HUAWEI | awk '{print $1}' | sort | uniq | wc -l
統(tǒng)計某接口訪問次數(shù)最多的ip
awk '($4>="[05/Mar/2020:15:40:00]" && $4<="[05/Mar/2020:15:50:00]"){print $0}' localhost_access_log.2020-03-05.txt | grep listCourse.do | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
參考
https://blog.csdn.net/c1052981766/article/details/79423429