﻿# Apache log rotate 的另一個選擇：cronolog

雖然 Apache 的 [mod\_log\_config](http://httpd.apache.org/docs/2.0/mod/mod_log_config.html) 模組本身有內建 [TransferLog](http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#transferlog) 參數(Directive)與 [rotatelogs](http://httpd.apache.org/docs/2.0/programs/rotatelogs.html) 工具，可供設定固定時間產生一個 Log 檔，例如說你想要每天產生一個 AccessLog 可以用以下設定：

```
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
TransferLog "|/usr/sbin/rotatelogs /var/logs/apache2/access_log 86400"
```

不過，缺點是他最多只能設定到「固定時間」產生一個檔，例如說以上範例是設定每 86400 秒產生一個 Log 檔，檔案名稱固定長這樣：

```
access_log.1211414400
access_log.1211500800
access_log.1211587200
access_log.1211673600
access_log.1211760000
access_log.1211846400
access_log.1211932800
access_log.1212019200
access_log.1212105600
access_log.1212192000
```

也就是你設定的檔名後面加上一個時間戳記(Timestamp)，這檔名實在不是很好看，從 Apache 2.0 之後的 [rotatelogs](http://httpd.apache.org/docs/2.0/programs/rotatelogs.html) 工具新增了一些功能，可以讓你設定自訂 Log 檔名格式，可以讓你輸出的檔名加上日期時間：

```
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
TransferLog "|/usr/sbin/rotatelogs /var/logs/apache2/access_log.%Y-%m-%d-%H_%M_%S 86400"
```

不過我還是覺得怪怪的，因為他總是不能夠依照日曆天區分每天的 Log，也就是說每天產生一個 Log 的標準是從 0:00 ~ 23:59 的 Log，因為這個限制我找了另外一個好用的 log rotate 套件：[cronolog](https://github.com/fordmason/cronolog)

如果你用的是 [Ubuntu](https://web.archive.org/web/20080530235527/http://www.ubuntu.org.tw:80/?) 的話，只要執行以下指令就可以安裝完成了：

```
apt-get install cronolog
```

安裝好之後，你也可以用 dpkg-query -L cronolog 指令查看你到底安裝了哪些檔案在你的系統中：

```
root@ubuntu804:~/build/cronolog-1.6.2# dpkg-query -L cronolog
/.
/usr
/usr/bin
/usr/bin/cronolog
/usr/bin/cronosplit
/usr/sbin
/usr/sbin/cronolog
/usr/share
/usr/share/info
/usr/share/info/cronolog.info.gz
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/cronolog.1m.gz
/usr/share/man/man1/cronosplit.1m.gz
/usr/share/doc
/usr/share/doc/cronolog
/usr/share/doc/cronolog/changelog.Debian.gz
/usr/share/doc/cronolog/TODO
/usr/share/doc/cronolog/README.Debian
/usr/share/doc/cronolog/copyright
/usr/share/doc/cronolog/changelog.gz
/usr/share/doc/cronolog/NEWS.gz
/usr/share/doc/cronolog/README.gz
/usr/share/doc/cronolog/ChangeLog.gz
```

如果你不是用 [Ubuntu](https://web.archive.org/web/20080530235527/http://www.ubuntu.org.tw:80/?) 的話，你要到 [cronolog](https://github.com/fordmason/cronolog) 網站下載套件回來自行編譯後安裝：

```
wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
tar zxf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure
make
make check
make install
```

安裝好之後直接修改 Apache 的設定檔，將原本的 CustomLog 設定，假設你原本的設定是：

```
CustomLog /var/log/apache2/access_log combined
```

若要換成 cronolog 的設定可以參考以下設定：

```
CustomLog "|/usr/local/sbin/cronolog /var/log/apache2/access_log.%Y-%m-%d" combined
```

設定好之後記得重新載入新的 Apache 設定檔或重新啟動 Apache 才會讓新的設定生效。之後我們的 Log 檔名就會變成以下這樣，而且每天正好都是一個檔案。

```
access_log.2008-06-08
access_log.2008-06-09
access_log.2008-06-10
access_log.2008-06-11
```

若你想要參考更詳細的設定方式可以參考 [Cronolog usage](https://github.com/fordmason/cronolog) 網頁上的說明。

**相關連結**

-   [cronolog homepage](https://github.com/fordmason/cronolog)
-   [cronolog usage](https://github.com/fordmason/cronolog)
