IISLog分析工具

近期遭遇到網站流量異常變大,但從線上人數來看卻並沒有發現異常的增加,首先檢查了是否有異常大的圖片,或是最近有上線什麼特別的程式,然而卻沒有任何的發現,直到開始使用了 Log Parser Studio, 人生就從黑白變成彩色的了

一般來說沒事不會去看IIS log,即便看了IIS log,也很難從時間點去找到想看的資料,猶如大海撈針

但如果IIS log 能變成資料庫來使用,而且可以讓你使用類似 SQL 的語法,這樣是不是很誘人?

Log Parser Studio 就是這麼棒的工具

安裝上與 IIS log 可以參考這一篇文章

當你安裝完之後,首先需要從 IIS 上把 log 拉到有安裝 Log parser studio 的電腦

從檔案來看,可以發現最後異動日期都是隔日的早上 8 點,這是因為我的時區是 UTC+8

而 IIS Log 裡面的日期都是存放 UTC+0 的時區,所以換算下來的確是沒錯的

從 file name 其實也可以很清楚的看出來 IIS 很貼心的幫你做了清楚的區分,讓我們在抓 log 的時候不會抓錯檔案

我們可以一口氣把想要的資料全部放進來當做資料來源

並設定你的檔案類型是哪一種,這樣程式才知道要使用哪種類型的檔案來解析

如果熟悉 SQL 語法的話,接下來就會方便非常多,但語法還是跟 SQL 有一點差異

IIS 原始資料

#Software: Microsoft Internet Information Services 8.5
#Version: 1.0
#Date: 2018-09-07 00:00:00
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2018-09-07 00:00:00 127.0.0.1 GET /js/jquery-ui-1.10.3.min.js - 80 - 13.209.15.55 Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/55.0.2883.87+Safari/537.36 http://localhost/ 304 0 0 0

其實跟原始資料是幾乎為一模一樣的資料

 

以下列了最常見的幾種轉換語法

時間轉換

如上圖,date 與 time 是分開存放的, 在轉換日期上較為麻煩一些

轉換成 UTC+0 時間格式

TO_TIMESTAMP([date], [time])

轉換成當下時區的時間格式 

TO_LOCALTIME(TO_TIMESTAMP([date], [time]))

 

字串處理

將 request url 轉成小寫 (比方說 /default.aspx 與 /Default.aspx 是會被分開統計的,所以會需要統一轉成大寫或小寫方便統計) 

To_Lowercase(cs-uri-stem)

取得部份字串資料 (以下是把時間轉成字串到 年月日 時分部份,再把分的部份取到十的單位,以便方便統計每十分鐘的請求流量)

substr(To_STRING(TO_LOCALTIME(TO_TIMESTAMP([date], [time])), 'yyyy-MM-dd HH:mm'), 0, 15)

 

常見查詢

統計某個時間區間的不同資源請求數量

SELECT To_Lowercase(cs-uri-stem), count(1)
FROM '[LOGFILEPATH]'
where 
 TO_LOCALTIME(TO_TIMESTAMP([date], [time]))
BETWEEN TO_TIMESTAMP('2018-09-11 16:00:00', 'yyyy-MM-dd HH:mm:ss')
    AND     TO_TIMESTAMP('2018-09-11 17:00:00', 'yyyy-MM-dd HH:mm:ss')
group by To_Lowercase(cs-uri-stem)
order by count(1) desc

統計 client IP 特定時間區間的日請求量 (如果你的 log 檔案已經選取了你所指定的時間,那麼就不需指定 where 條件的時間)

SELECT c-ip, To_STRING(TO_LOCALTIME(TO_TIMESTAMP([date], [time])), 'yyyy-MM-dd') as eventDate, count(1) as totalRequest
FROM '[LOGFILEPATH]'
where 
 TO_LOCALTIME(TO_TIMESTAMP([date], [time]))
BETWEEN TO_TIMESTAMP('2018-09-07 10:00:00', 'yyyy-MM-dd HH:mm:ss')
    AND     TO_TIMESTAMP('2018-09-18 00:00:00', 'yyyy-MM-dd HH:mm:ss')
group by c-ip, To_STRING(TO_LOCALTIME(TO_TIMESTAMP([date], [time])), 'yyyy-MM-dd')
order by count(1) desc

是否感受到了 LogParser 的強大效能了嗎?

參考資料

https://dotblogs.com.tw/kinanson/2017/08/18/145528

https://blog.miniasp.com/post/2009/11/16/LogParser-date-time-and-IIS-Log-Analysis-Tips.aspx