『壹』 使用python解析nginx日誌文件
本文使用Python2.7解析nginx日誌文件,並把nginx的時間轉化為時間戳(1970紀元後經過的浮點秒數),並存放到特定文件中。
Nginx的http日誌格式:
示例如下:
這里使用Python的glob模塊來獲取所有日誌文件。日誌文件每天0時進行備份,命名為nginx.log.YYMMDD。
模塊linecache允許從任何文件里得到任何的行,並且使用緩存進行優化,常見的情況是從單個文件讀取多行。
使用python的re模塊解析每一條日誌。
其中body_bytes捕獲非空字元串,而不是數字,因為日誌里可能存在該欄位值為「-」,即沒有請求體。
date、method、request等參數可以採用以下方式進行提取。
使用python的time模塊把時間轉為時間戳。
產生文件time.log,內容如下:
『貳』 14《Nginx 入門教程》Nginx的日誌功能
通常,在生產環境中使用 Nginx 進行反向代理和負載均衡或者各種其他處理時,良好的日誌記錄是非常關鍵的一環。通過精心配置的 Nginx 日誌,我們可以獲取用戶的真實 ip、瀏覽器信息,請求處理時間,請求URL等,這樣方便我們排查和回溯錯誤。具體要記錄哪些信息,可以通過 Nginx 中的 log_format 指令定義,由它定義日誌的格式。而對於使用哪種日誌格式和設置日誌的保存路徑則由 access_log 指令指定的。另外在 Nginx 中還有一個配置伺服器和請求處理過程中的錯誤信息的指令,那就是 error_log指令。最後,如果在配置的日誌文件路徑中使用了變數,我們可以通過open_log_file_cache指令來設置緩存,提升性能。對於大型的網站而言,大量的 http 請求意味著大量的日誌記錄,及時按天或按大小進行 Nginx 日誌備份也至關重要的。
在 Nginx 的日誌模塊主要有2個, ngx_stream_log_mole 和 ngx_http_log_mole,分別表示四層的日誌模塊和七層的日誌模塊,其指令和用法都是一致的,接下來我們只針對 http 請求的日誌進行說明和使用。
在 ngx_http_log_mole 模塊中,只3個指令,分別是 access_log、log_format 和 open_log_file_cache。這些指令具體的格式如下:
ngx_http_log_mole 模塊用來按某個格式來記錄請求的日誌。模塊中的 log_format 指令就是用來設置列印日誌的格式,該指令中可以使用 Nginx 中的各種變數,比如保存遠端ip地址的變數$remote_addr等。一個簡單的示例如下:
接下來是 access_log 指令。參考前面的指令格式。關閉日誌記錄,直接是寫 access_log off ,如果打開 access 日誌,它的寫法是:
access_log 指令示例:
每一條日誌記錄的寫入都是先打開文件再寫入記錄,然後關閉日誌文件。如果你的日誌文件路徑中使用了變數,如 access_log /var/logs/$host/access.log ,為提高性能,可以使用 open_log_file_cache 指令設置日誌文件描述符的緩存。可以通過 open_log_file_cache off 關閉該緩存。該指令的幾個參數選項說明如下:
最後 error_log 是 錯誤日誌配置指令,主要記錄客戶端訪問 Nginx 出錯時的日誌,它不不支持自定義日誌格式。通過檢查錯誤日誌,可以快速定位線上問題,所以也是很重要的。關閉錯誤日誌的方式和 access_log不一樣,沒有 error_log off 這樣關錯誤日誌的用法,反而會將錯誤日誌打到名為 off 的文件中。常用的關閉方式是:
就像在 Linux 系統中,輸出到 /dev/null 的內容實際上等價於丟棄一樣。
Nginx 的日誌切割實現的核心是使用 nginx 命令的 reopen 參數實現,該參數的含義是重新開始記錄日誌文件。人工切的做法就是凌晨將日誌備份,然後執行帶reopen參數的命令:
執行後會重新生成 access.log 和 error.log,這就是手工切割的方式。通常我們會用 shell 腳本和定時任務來幫我我們完成自動切割。首先准備如下的 shell 腳本,它完成日誌的備份以及給 nginx 進程發生 reopen 信號。
接下來,只要將這個腳本加入到 crontab 中即可,如下操作:
我們在 nginx.conf 中添加如下的日誌配置:
這里我們綜合了前面涉及的知識,這里只簡單測試日誌配置中 if 功能。我們設置請求的相應碼為 3xx 和 4xx 時,日誌不會記錄。接下來,啟動或者熱載入 Nginx, 然後分別對應三個埠發送 http 請求並觀察 access.log 日誌:
本小節我們介紹了 log 相關的指令,包括訪問日誌和錯誤日誌的指令。此外還介紹了 Nginx 中對日誌切割的常用處理方法,這也是生產環境上使用日誌備份的手段。
『叄』 如何用 python 分析網站日誌
日誌的記錄
Python有一個logging模塊,可以用來產生日誌。
(1)學習資料
http://blog.sina.com.cn/s/blog_4b5039210100f1wv.html
http://blog.donews.com/limodou/archive/2005/02/16/278699.aspx
http://kenby.iteye.com/blog/1162698
http://blog.csdn.NET/fxjtoday/article/details/6307285
前邊幾篇文章僅僅是其它人的簡單學習經驗,下邊這個鏈接中的內容比較全面。
http://www.red-dove.com/logging/index.html
(2)我需要關注內容
日誌信息輸出級別
logging模塊提供了多種日誌級別,如:NOTSET(0),DEBUG(10),
INFO(20),WARNING(30),WARNING(40),CRITICAL(50)。
設置方法:
logger = getLogger()
logger.serLevel(logging.DEBUG)
日誌數據格式
使用Formatter設置日誌的輸出格式。
設置方法:
logger = getLogger()
handler = loggingFileHandler(XXX)
formatter = logging.Formatter("%(asctime)s %(levelname) %(message)s","%Y-%m-%d,%H:%M:%S")
%(asctime)s表示記錄日誌寫入時間,"%Y-%m-%d,%H:%M:%S「設定了時間的具體寫入格式。
%(levelname)s表示記錄日誌的級別。
%(message)s表示記錄日誌的具體內容。
日誌對象初始化
def initLog():
logger = logging.getLogger()
handler = logging.FileHandler("日誌保存路徑")
formatter = logging.Formatter("%(asctime)s %(levelname) %(message)s","%Y-%m-%d,%H:%M:%S")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel
寫日誌
logging.getLogger().info(), logging.getLogger().debug()......
2. 日誌的分析。
(1)我的日誌的內容。(log.txt)
2011-12-12,12:11:31 INFO Client1: 4356175.0 1.32366309133e+12 1.32366309134e+12
2011-12-12,12:11:33 INFO Client1: 4361320.0 1.32366309334e+12 1.32366309336e+12
2011-12-12,12:11:33 INFO Client0: 4361320.0 1.32366309389e+12 1.32366309391e+12
2011-12-12,12:11:39 INFO Client1: 4366364.0 1.32366309934e+12 1.32366309936e+12
2011-12-12,12:11:39 INFO Client0: 4366364.0 1.32366309989e+12 1.32366309991e+12
2011-12-12,12:11:43 INFO Client1: 4371416.0 1.32366310334e+12 1.32366310336e+12
2011-12-12,12:11:43 INFO Client0: 4371416.0 1.32366310389e+12 1.32366310391e+12
2011-12-12,12:11:49 INFO Client1: 4376450.0 1.32366310934e+12 1.32366310936e+12
我需要將上述內容逐行讀出,並將三個時間戳提取出來,然後將其圖形化。
(2) 文件操作以及字元串的分析。
打開文件,讀取出一行日誌。
file = file("日誌路徑",「r」)
while True:
line = file.readline()
if len(len) == 0:
break;
print line
file.close()
從字元串中提取數據。
字元串操作學習資料:
http://reader.you.com/sharelite?itemId=-4646262544179865983&method=viewSharedItemThroughLink&sharedBy=-1137845767117085734
從上面展示出來的日誌內容可見,主要數據都是用空格分隔,所以需要使用字元串的
split函數對字元串進行分割:
paraList = line.split(),該函數默認的分割符是空格,返回值為一個list。
paraList[3], paraList[4], paraList[5]中分別以字元串形式存儲著我需要的時間戳。
使用float(paraList[3])將字元串轉化為浮點數。
(3)將日誌圖形化。
matplotlib是python的一個繪圖庫。我打算用它來將日誌圖形化。
matplotlib學習資料。
matplotlib的下載與安裝:
http://yexin218.iteye.com/blog/645894
http://blog.csdn.Net/sharkw/article/details/1924949
對matplotlib的宏觀介紹:
http://apps.hi..com/share/detail/21928578
對matplotlib具體使用的詳細介紹:
http://blog.sina.com.cn/s/blog_4b5039210100ie6a.html
在matplotlib中設置線條的顏色和形狀:
http://blog.csdn.net/kkxgx/article/details/python
如果想對matplotlib有一個全面的了解,就需要閱讀教程《Matplotlib for Python developers》,教程下載地址:
http://download.csdn.net/detail/nmgfrank/4006691
使用實例
import matplotlib.pyplot as plt
listX = [] #保存X軸數據
listY = [] #保存Y軸數據
listY1 = [] #保存Y軸數據
file = file("../log.txt","r")#打開日誌文件
while True:
line = file.readline()#讀取一行日誌
if len(line) == 0:#如果到達日誌末尾,退出
break
paraList = line.split()
print paraList[2]
print paraList[3]
print paraList[4]
print paraList[5]
if paraList[2] == "Client0:": #在坐標圖中添加兩個點,它們的X軸數值是相同的
listX.append(float(paraList[3]))
listY.append(float(paraList[5]) - float(paraList[3]))
listY1.append(float(paraList[4]) - float(paraList[3]))
file.close()
plt.plot(listX,listY,'bo-',listX,listY1,'ro')#畫圖
plt.title('tile')#設置所繪圖像的標題
plt.xlabel('time in sec')#設置x軸名稱
plt.ylabel('delays in ms'')#設置y軸名稱
plt.show()
『肆』 python 分析系統日誌
這個不用做計劃任務。直接用tail -f 文件名|grep executing too slow
這樣就可以了。然後wc統計行數。
如果你一定要用python做。就使用文件對象中的seek方法,移到上次處理的位置。