認識與分析登錄檔
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