【CentOS】讓 Linux 系統為自己的 PHP 程式寫 log

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