1. 程式人生 > >Linux下apache日誌(按日期存放)分析與狀態檢視方法

Linux下apache日誌(按日期存放)分析與狀態檢視方法

一、apache日誌按日期記錄

在apache的配置檔案中找到
ErrorLog logs/error_log
CustomLog logs/access_log common

Linux系統配置方法:

將其改為
ErrorLog “| /usr/local/apache/bin/rotatelogs /home/logs/www/%Y_%m_%d_error_log 86400 480″
CustomLog “| /usr/local/apache/bin/rotatelogs /home/logs/www/%Y_%m_%d_access_log 86400 480″ common

Windows系統下配置方法:

#ErrorLog “|bin/rotatelogs.exe logs/vicp_net_error-%y%m%d.log 86400 480″
#CustomLog “|bin/rotatelogs.exe logs/vicp_net_access-%y%m%d.log 86400 480″ common

第一次不知道設定480這個引數,導致日誌記錄時間和伺服器時間相差8小時,原來是rotatelogs有一個offset引數,表示相對於UTC的時差分鐘數,中國是第八時區,相差480分鐘。86400是表示1天。

附rotatelogs說明

rotatelogs logfile [ rotationtime [ offset ]] | [ filesizeM ]

選項
logfile
它加上基準名就是日誌檔名。如果logfile中包含’%’,則它會被視為用於的strftime(3)的格式字串;否則,它會被自動加上以秒為單位的.nnnnnnnnnn字尾。這兩種格式都表示新的日誌開始使用的時間。
rotationtime
日誌檔案回捲的以秒為單位的間隔時間
offset
相對於UTC的時差的分鐘數。如果省略,則假定為0,並使用UTC時間。比如,要指定UTC時差為-5小時的地區的當地時間,則此引數應為-300。
filesizeM
指定回捲時以兆位元組為單位的字尾字母M的檔案大小,而不是指定回捲時間或時差。

二、設定apache日誌記錄格式

定製日誌檔案的格式涉及到兩個指令,即LogFormat指令和CustomLog指令,預設httpd.conf檔案提供了關於這兩個指令的幾個示例。

LogFormat指令定義格式併為格式指定一個名字,以後我們就可以直接引用這個名字。CustomLog指令設定日誌檔案,並指明日誌檔案所用的格式(通常通過格式的名字)。

LogFormat指令的功能是定義日誌格式併為它指定一個名字。例如,在預設的httpd.conf檔案中,我們可以找到下面這行程式碼:

LogFormat “%h %l %u %t \”%r\” %>s %b” common

該指令建立了一種名為“common”的日誌格式,日誌的格式在雙引號包圍的內容中指定。格式字串中的每一個變數代表著一項特定的資訊,這些資訊按照格式串規定的次序寫入到日誌檔案。

Apache文件已經給出了所有可用於格式串的變數及其含義,下面是其譯文:
%…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設定得到的伺服器名字

在所有上面列出的變數中,“…”表示一個可選的條件。如果沒有指定條件,則變數的值將以“-”取代。分析前面來自預設httpd.conf檔案的 LogFormat指令示例,可以看出它建立了一種名為“common”的日誌格式,其中包括:遠端主機,遠端登入名字,遠端使用者,請求時間,請求的第一 行程式碼,請求狀態,以及傳送的位元組數。

有時候我們只想在日誌中記錄某些特定的、已定義的資訊,這時就要用到“…”。如果在“%”和變數之間放入了一個或者多個HTTP狀態程式碼,則只有當請 求返回的狀態程式碼屬於指定的狀態程式碼之一時,變數所代表的內容才會被記錄。例如,如果我們想要記錄的是網站的所有無效連結,那麼可以使用:
LogFormat @4{Referer}i BrokenLinks

反之,如果我們想要記錄那些狀態程式碼不等於指定值的請求,只需加入一個“!”符號即可:

LogFormat %!200U SomethingWrong

三、專門記錄某個蜘蛛記錄

SetEnvIfNoCase User-Agent Baiduspider baidu_robot
LogFormat “%h %t \”%r\” %>s %b” robot
linux下
CustomLog “|/usr/local/apache2.2.0/bin/rotatelogs /usr/local/apache2.2.0/logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot
windows下
CustomLog “|bin/rotatelogs.exe logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot
這樣在logs目錄下,就會每天產生baidu_年月日.txt的日誌了,每條的記錄和下面的類似:
61.135.168.14 [22/Oct/2008:22:21:26 +0800] “GET / HTTP/1.1″ 200 8427

四、去掉日誌中的圖片、jscss、swf檔案

<FilesMatch "\.(ico|gif|jpg|png|bmp|swf|css|js)">
SetEnv IMAG 1
</FilesMatch>
CustomLog "|bin/cronolog.exe logs/cpseadmin/access_%Y%m%d.log" combined env=!IMAG

清除error.log、access.log並限制Apache日誌檔案大小的方法
Apache下的access.log和error.log檔案從安裝伺服器到現在沒有動過,今天突然discuz 的MYSQL資料庫連線錯誤,提示2003 錯誤,檢查發現原來是error.log、access.log爆滿,檔案達到30個G,奶奶的,立馬搜尋,得把這兩個小子幹掉。

下面是在網上搜索到的方法,立馬見效,頂一個!

在 Windows 下的設定例子如下:
第一步:刪除 Apache2/logs/目錄下的 error.log、access.log檔案

第二步:開啟 Apache 的 httpd.conf配置檔案並找到下面兩條配置

ErrorLog logs/error.log
CustomLog logs/access.log common

直接註釋掉,換成下面的配置檔案。


# 限制錯誤日誌檔案為 1M
ErrorLog “|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 1M”

# 每天生成一個錯誤日誌檔案
#ErrorLog “|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 86400″

# 限制訪問日誌檔案為 1M
CustomLog “|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 1M” common

# 每天生成一個訪問日誌檔案
#CustomLog “|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400″ common

參考:


Apache下的access.log和error.log檔案處理方法

這幾天有會員和我說到網站訪問速度越來越慢。我查了一下,看到Apache2下面有兩個日誌檔案非常大了,加起來有800多M了。
分別是access.log和error.log。

於是在網上找找了給access.log和error.log減肥的方法,這個方法可讓這兩個檔案按每天日期生成。這樣你可以選擇
把前面的舊檔案刪除了。

在Apache下的httpd.conf配置檔案下找到下面兩句:

ErrorLog logs/error.log

CustomLog logs/access.log common

然後把這兩句分別改為如下:

CustomLog “|D:/apache2/bin/rotatelogs.exe D:/apache2/logs/access_%Y_%m_%d.log 86400 480″ common

ErrorLog “|D:/apache2/bin/rotatelogs.exe D:/apache2/logs/error_%Y_%m_%d.log 86400 480″

一切就這麼簡單,這樣這兩個日誌檔案每天都會起一個新檔案,就不至於單個檔案太大,打不開,而無法看到日誌資訊了.
你還可以把前面的日誌檔案刪除。

access.log,件在 WEB 伺服器執行一段時間之後會達到幾十兆甚至上百兆,如果Apache執行有錯誤,error.log也會增大到幾十兆,我們知道系統讀寫一個大的文字檔案是非常耗記憶體的,因此限定日誌檔案大小十分必要。
日誌檔案大小的配置指令,通過參考http://httpd.apache.org/docs/2.0/programs /rotatelogs.html,可以用apache 自己的程式 rotatelogs.exe(位於 {$apache}/bin/目錄下),來限制日誌檔案的大小。
Usage: rotatelogs [-l] [offset minutes from UTC] or
Add this:
TransferLog “|rotatelogs /some/where 86400″
or
TransferLog “|rotatelogs /some/where 5M”
to httpd.conf. The generated name will be /some/where.nnnn where nnnn is the system time at which the log nominally starts (N.B. if using a rotation time, the time will always be a multiple of the rotation time, so you can synchronizecron scripts with it). At the end of each rotation time or when the file size is reached a new log is started.
在 Windows 下的設定例子如下:
# 限制錯誤日誌檔案為 1M
ErrorLog “|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 1M”
# 每天生成一個錯誤日誌檔案
#ErrorLog “|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 86400″
# 限制訪問日誌檔案為 1M
CustomLog “|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 1M” common
# 每天生成一個訪問日誌檔案
#CustomLog “|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400″ common
linux/Unix下 應該類似。


清除apache的access.log方法

有個客戶伺服器是用apache搭建的,最近總是感覺站很慢,伺服器很慢很卡,有時候甚至網站都打不開,後來經過排查分析原來是裡面的access.log和error.log這兩個檔案要經常上去看,和清理,如果時間忙,忘記看和清理了,過不了多久,這兩個檔案就膨脹的非常的大,打都打不開了。 下面就跟你說下 清理access.log和error.log這兩個日誌檔案的方法希望對大家有些幫助。也懷疑懷疑是有其他的爬蟲,明天都在爬我的幾個網站。
優化access.log和error.log的方法如下 :
CustomLog “|D:/thridparty-system/java/apache2/bin/rotatelogs.exe D:/thridparty-system/java/apache2/logs/access_%Y_%m_%d.log 86400 480″ common
ErrorLog “|D:/thridparty-system/java/apache2/bin/rotatelogs.exe D:/thridparty-system/java/apache2/logs/error_%Y_%m_%d.log 86400 480″
一切就這麼簡單,這樣這兩個日誌檔案每天都會起一個新檔案,就不至於單個檔案太大,打不開,而無法看到日誌資訊了.

解決Apache日誌檔案ACCESS.LOG日益膨脹的一個辦法

將httpd.conf中customlog logs/access.log common 改成

customlog “|c:/apache/bin/rotatelogs c:/apache/logs/%y_%m_%d.access.log 86400 480″ common

重啟apache

其中c:/apache/是你安裝apache的路徑
這樣每一天生成一個日誌檔案

解決Apache日誌檔案ACCESS.LOG日益膨脹的一個辦法

APACHE 日誌檢視與分析

假設apache日誌格式為:
118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] “GET /Public/Css/index.css HTTP/1.1″ 304 – “http://www.a.cn/common/index.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.3)”

問題1:在apachelog中找出訪問次數最多的10個IP。
awk '{print $1}' apache_log |sort |uniq -c|sort -nr|head -n 10

awk 首先將每條日誌中的IP抓出來,如日誌格式被自定義過,可以 -F 定義分隔符和 print指定列;
sort進行初次排序,為的使相同的記錄排列到一起;
upiq -c 合併重複的行,並記錄重複次數。
head進行前十名篩選;
sort -nr按照數字進行倒敘排序。

我參考的命令是:
顯示10條最常用的命令
sed -e "s/| //n/g" ~/.bash_history | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | head

問題2:在apache日誌中找出訪問次數最多的幾個分鐘。
awk '{print  $4}' access_log |cut -c 14-18|sort|uniq -c|sort -nr|head
awk 用空格分出來的第四列是[09/Jan/2010:00:59:59;
cut -c 提取14到18個字元
剩下的內容和問題1類似。

問題3:在apache日誌中找到訪問最多的頁面:
awk '{print $11}' apache_log |sed 's/^.*cn/(.*/)/"//1/g'|sort |uniq -c|sort -rn|head

類似問題1和2,唯一特殊是用sed的替換功能將”http://www.a.cn/common/index.php”替換成括號內的內容:”http://www.a.cn(/common/index.php)”

問題4:在apache日誌中找出訪問次數最多(負載最重)的幾個時間段(以分鐘為單位),然後在看看這些時間哪幾個IP訪問的最多?
1,檢視apache程序:
ps aux | grep httpd | grep -v grep | wc -l

2,檢視80埠的tcp連線:
netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l

3,通過日誌檢視當天ip連線數,過濾重複:
cat access_log | grep "19/May/2011" | awk '{print $2}' | sort | uniq -c | sort -nr

4,當天ip連線數最高的ip都在幹些什麼(原來是蜘蛛):
cat access_log | grep "19/May/2011:00" | grep "61.135.166.230" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10

5,當天訪問頁面排前10的url:
cat access_log | grep "19/May/2010:00" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10

6,用tcpdump嗅探80埠的訪問看看誰最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr

接著從日誌裡檢視該ip在幹嘛:
cat access_log | grep 220.181.38.183| awk '{print $1"/t"$8}' | sort | uniq -c | sort -nr | less

7,檢視某一時間段的ip連線數:
grep "2006:0[7-8]" www20110519.log | awk '{print $2}' | sort | uniq -c| sort -nr | wc -l

8,當前WEB伺服器中聯接次數最多的20條ip地址:
netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -n -r | head -n 20

9,檢視日誌中訪問次數最多的前10個IP
cat access_log |cut -d ' ' -f 1 |sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 |less

10,檢視日誌中出現100次以上的IP
cat access_log |cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr |less

11,檢視最近訪問量最高的檔案
cat access_log |tail -10000|awk '{print $7}'|sort|uniq -c|sort -nr|less

12,檢視日誌中訪問超過100次的頁面
cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less

13,列出傳輸時間超過 30 秒的檔案
cat access_log|awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20

14,列出最最耗時的頁面(超過60秒的)的以及對應頁面發生次數
cat access_log |awk '($NF > 60 && $7~//.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100