最近工作上又有機會用到 LogParser 來分析 IIS 紀錄,藉此整理一下 LogParser 對時間、日期處理的各種使用情境,以及在分析 IIS Log 時的一些小技巧。
與日期時間相關的操作方法
取得系統時間 ( GMT +0000 )
LogParser 日期相關心得筆記與分析 IIS Logs 技巧分享 (zh-TW)
最近工作上又有機會用到 LogParser 來分析 IIS 紀錄,藉此整理一下 LogParser 對時間、日期處理的各種使用情境,以及在分析 IIS Log 時的一些小技巧。
與harpcode" id="codeSnippet">SYSTEM_TIMESTAMP()
取得系統本地時間 ( 若在台灣就會回傳 GMT +0800 的時間 )
TO_LOCALTIME(SYSTEM_TIMESTAMP())取得 GMT +1000 的時間
ADD(SYSTEM_TIMESTAMP(), TIMESTAMP('10', 'h'))取得今天的日期時間字串 (與 .NET 的 DateTime.ToString 方法 類似)
TO_STRING(TO_LOCALTIME(SYSTEM_TIMESTAMP()), 'yyyy-MM-dd HH:mm:ss')
取得今天的日期字串 (與 .NET 的 DateTime.ToString 方法 類似)
TO_STRING(TO_LOCALTIME(SYSTEM_TIMESTAMP()), 'yyyy-MM-dd')
顯示昨天的日期時間
請注意下例的 TIMESTAMP 函示,由於所有 Timestamp 是從 0000-01-01 00:00:00 開始計算的(代表0),所以當第一個參數是傳入 2,第二個參數是 d (日期),則代表 0000-01-02 00:00:00 這個時間點,所以這裡所換算出來的 Timestamp 數值代表 1 天的時間,然後再利用 SUB 相減函示與本地時間計算後,就是昨天的時間了!
SUB(TO_LOCALTIME(SYSTEM_TIMESTAMP()), TIMESTAMP('2', 'd'))顯示明天的日期時間
ADD(TO_LOCALTIME(SYSTEM_TIMESTAMP()), TIMESTAMP('2', 'd'))取得本月第一天的開始時間
SUB(
TO_LOCALTIME(SYSTEM_TIMESTAMP()),
TO_TIMESTAMP(TO_STRING(TO_LOCALTIME(SYSTEM_TIMESTAMP()), 'dd HH:mm:ss'), 'dd HH:mm:ss')
)注意事項
- 如果你希望用「本地時間」計算日期部分,請不要用 SYSTEM_DATE(),即便你用範例所提供的 TO_LOCALTIME( SYSTEM_DATE() ) 我自己實驗的結果騎日期一樣是錯的,並非系統本地日期!
與 IIS 相關的技巧
由於 IIS Log 的日期、時間是分開兩個欄位,必須用以下語法合併
TO_TIMESTAMP([date], [time])由於預設 IIS Log 都是以 GMT 標準時間當成 Log 的紀錄,若要轉換成本地時間可用以下語法:
TO_LOCALTIME(TO_TIMESTAMP([date], [time]))篩選出特定時間區間的 Log 紀錄
SELECT
*
FROM
C:\inetpub\logs\LogFiles\W3SVC1\*.log
WHERE
TO_TIMESTAMP([date], [time])
BETWEEN TO_TIMESTAMP('2009-11-13 00:00:00', 'yyyy-MM-dd HH:mm:ss')
AND TO_TIMESTAMP('2009-11-13 23:59:59', 'yyyy-MM-dd HH:mm:ss')讀取 IIS Log 可以不用明確指定路徑,如果要分析本機的 IIS Log 可以直接指定 [站台識別元] ( Site ID ) 或 [站台名稱] 即可載入該站台下所有 Logs ( 可用 * 萬用字元 )
如下範例為載入 Site ID 為 1 與 2232 以及站台名稱為 VWeb 開頭的所有站台的所有 Logs
SELECT * FROM <1>, <2232>, <www.*.com.tw>在 IIS 7 / IIS 7.5 如果要用這種簡易的語法必須要安裝 [IIS 6 Metabase 相容性] 才能使用:
相關連結