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

最近工作上又有機會用到 [LogParser](http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07) 來分析 IIS 紀錄，藉此整理一下 [LogParser](http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07) 對時間、日期處理的各種使用情境，以及在分析 IIS Log 時的一些小技巧。

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

取得系統時間 ( GMT +0000 )

```
SYSTEM_TIMESTAMP()
```

取得系統本地時間 ( 若在台灣就會回傳 GMT +0800 的時間 )

```
TO_LOCALTIME(SYSTEM_TIMESTAMP())
```

取得 GMT +1000 的時間

```
ADD(SYSTEM_TIMESTAMP(), TIMESTAMP('10', 'h'))
```

取得**今天的日期時間**字串 （與 .NET 的 [DateTime.ToString 方法](http://msdn.microsoft.com/zh-tw/library/ht77y576.aspx) 類似）

```
TO_STRING(TO_LOCALTIME(SYSTEM_TIMESTAMP()), 'yyyy-MM-dd HH:mm:ss')
```

取得**今天的日期**字串 （與 .NET 的 [DateTime.ToString 方法](http://msdn.microsoft.com/zh-tw/library/ht77y576.aspx) 類似）

```
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\*.logWHERE    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  ( 可用 \* 萬用字元 )

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f66aa25b525bc793c640-image_9.png)

如下範例為載入 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 相容性](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8e67b286ca8207ac991e-image.png "網頁伺服器 (IIS) :: 新增角色服務 :: 管理工具 :: IIS 6 管理相容性 :: IIS 6 Metabase 相容性")

![Windows Features: IIS Metabase and IIS 6 configuration compatibility](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f554fbaa150c6aa12f58-image.png "Windows Features: IIS Metabase and IIS 6 configuration compatibility")

**相關連結**

-   [LogParser 2.2](http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07)
