認識與分析登錄檔
rsyslogd - Linux man page
php.net - syslog
Linux 超強的 log 記錄功能,其實也有開放給管理者,我們可以透過 rsyslog 將自己程式的執行過程記錄下來。
您可以自行決定放置 log 檔的位置,但建議為了一致性,還是將 log 檔放在 /var/log。
假設,要將自己的程式 log 檔放在 /var/log/myphplog/
先建立存放 log 檔的目錄
[root]# cd /var/log
[root]# mkdir myphplog
設定自己的程式要透過 Linux 系統記錄 log
[root]# vi /etc/rsyslog.conf
... ... # 註解:我的 PHP 程式 log # Linux 開放 local0 ~ local7, 也就是 8 個自定 log,給管理者使用 # 所以您最多可以有 8 組程式可以記錄 local0.* /var/log/myphplog/myphp.log
編輯 log 檔輪替的規則
[root]# vi /etc/logrotate.d/myphplog
# 註解:我的 PHP 程式 log 輪替規則 # 可以參考同目錄下其他 daemon 的設定寫法 # log 檔位置 /var/log/myphplog/myphp.log { # 每日輪替, 也就是說每天產生一個 log 檔 daily # 舊的 log 檔名後面帶西元日期 dateext # 自 CentOS7 才有的參數, 舊的 log 檔名後面帶昨天的西元日期 dateyesterday # 舊 log 保留檔案數 10 個檔, 即使有 dateext 參數也一樣要宣告 rotate 10 # 不壓縮 nocompress # 執行 logrotate 時, 若自己的 log 檔還沒產生, 可忽略不管 missingok # 重新啟動 rsyslog # 這步驟一定要做, 否則 rsyslog 會一直寫進舊的 log 檔, 即使舊 log 檔已輪替多日 # 比方說, 您自 2016/01/01 開始啟用, 則 myphp.log 輪替成舊檔後, 檔名會變成 myphp.log-20160101 # 若沒做重新啟動 rsyslog 這個動作, 即使到 2016/12/31, log 依然會寫進 myphp.log-20160101 postrotate # 二擇一 # 方法一, 網路上看到的多為這指令, 看起來應該是正規做法 /bin/kill -HUP 'cat /var/run/rsyslogd.pid 2> /dev/null' 2> /dev/null || true # 方法二, 看似有點暴力的土法, 目前不知有何後遺症 service rsyslog restart endscript }
重新啟動 rsyslog,讓您寫的設定檔生效
[root] # service rsyslog restart
寫一支小程式做測試
<?php date_default_timezone_set('Asia/Taipei'); openlog("myphplog", LOG_CONS, LOG_LOCAL0); // 第二個參數, 要寫入的訊息 syslog(LOG_INFO,"test log --".date('Y-m-d H:i:s')); closelog(); ?>
檢查是否有產生 log 檔
[root]# cd /var/log/myphplog
[root]# ls
果然生成一個 log 檔了
再看一下 log 檔內容
[root]# cat /var/log/myphplog/myphp.log
Dec 4 16:48:43 主機名 myphplog: test log --2016-12-04 16:48:43 Dec 4 16:48:45 主機名 myphplog: test log --2016-12-04 16:48:45 Dec 4 16:48:49 主機名 myphplog: test log --2016-12-04 16:48:49 Dec 4 16:48:55 主機名 myphplog: test log --2016-12-04 16:48:55