The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

LogParser 日期相關心得筆記與分析 IIS Logs 技巧分享

最近工作上又有機會用到 LogParser 來分析 IIS 紀錄,藉此整理一下 LogParser 對時間、日期處理的各種使用情境,以及在分析 IIS Log 時的一些小技巧。

 

與日期時間相關的操作方法

取得系統時間 ( GMT +0000 )

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 相容性] 才能使用:

網頁伺服器 (IIS) :: 新增角色服務 :: 管理工具 :: IIS 6 管理相容性 :: IIS 6 Metabase 相容性

Windows Features: IIS Metabase and IIS 6 configuration compatibility

 

相關連結