?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
把數(shù)據(jù)庫服務(wù)器的日志輸出保存在一個(gè)地方而不是僅僅把它們放到 /dev/null 里是個(gè)好主意。在碰到危險(xiǎn)的時(shí)候,日志輸出 是非常寶貴的。不過,日志輸出可能很龐大(特別是在比較高的調(diào)試級(jí)別上), 而且你不會(huì)無休止地保存它們。你需要rotate日志文件, 這樣生成新的日志文件并且經(jīng)常拋棄老的。
如果你簡單地把postgres 的 stderr 重定向到一個(gè)文件中,你會(huì)有日志輸出,但是截?cái)嗳罩疚募奈ㄒ坏姆椒? 是停止并重啟主服務(wù)器。這樣做對(duì)于開發(fā)環(huán)境中是可以的,但是你肯定 不想在生產(chǎn)環(huán)境中也這么干。
一個(gè)更好的辦法是把主服務(wù)器的 stderr 輸出發(fā)送到某種 日志滾動(dòng)程序里。我們有一個(gè)內(nèi)置的日志滾動(dòng)程序,你可以通過在 postgresql.conf 里設(shè)置配置參數(shù) logging_collector 為 true的辦法打開它。這個(gè)程序的控制參數(shù)在節(jié)Section 18.7.1里描述。 您也可以使用這種方法來捕獲日志數(shù)據(jù)在機(jī)器可讀的CSV (逗號(hào)分隔值)格式。
另外,如果你想使用一個(gè)外部日志滾動(dòng)程序(比如Apache 附帶的 rotatelogs 工具),你可以將 stderr 的輸出重定向到這個(gè)外部工具。 如果你用pg_ctl 啟動(dòng)服務(wù)器,那么 stderr 已經(jīng)重定向到 stdout ,因此你只需要一個(gè)管道命令,比如:
pg_ctl start | rotatelogs /var/log/pgsql_log 86400
另外一種生產(chǎn)級(jí)的管理日志輸出的方法就是把它們發(fā)送給 syslog 處理滾動(dòng)。要利用這個(gè)工具,我們需要設(shè)置postgresql.conf 里的 log_destination 為 syslog(記錄 syslog 日志)。然后在你想強(qiáng)迫 syslog 守護(hù)進(jìn)程開始寫入一個(gè)新日志文件的時(shí)候,就可以發(fā)送一個(gè) SIGHUP 信號(hào)給它。如果你想自動(dòng)滾動(dòng)日志文件, 那么我們可以配置 logrotate 程序 處理 syslog 的日志文件。
不過,在很多系統(tǒng)上,syslog 不是非??煽?, 特別是在大型日志信息的情況下;它可能在你最需要那些信息的時(shí)候截?cái)? 或者丟棄它們。還有,在 Linux上 syslog 會(huì)把每個(gè)消息刷新到磁盤上,導(dǎo)致很低下的性能。 你可以在 syslog 配置文件里面的文件名開頭使用 "-"來關(guān)閉這個(gè)行為。
請注意上面描述的所有解決方案關(guān)注的是在可配置的間隔上開始一個(gè)新 的日志文件,它們并沒有刪除不再需要的舊日志文件。你可能還需要設(shè)置 一個(gè)批處理,周期地刪除舊日志文件。另外一個(gè)可能的解法是配置日志 滾動(dòng)程序,讓它周期地覆蓋舊的日志文件。
pgFouine 是做復(fù)雜的日志文件分析的一個(gè)外部項(xiàng)目。 當(dāng)重要的消息出現(xiàn)在日志文件,以及許多其它特殊條件的檢測時(shí), check_postgres提供 Nagios 警告。