21.3. 日誌文件維護

把資料庫伺服器的日誌輸出保存在一個地方是個好主意, 而不是僅僅把它們放到 /dev/null 裡。 在碰到危險的問題的時候,日誌輸出是非常寶貴的。 不過,日誌輸出可能很龐大(特別是在比較高的調試級別上), 而且您不會無休止地保存它們.您需要"旋轉"日誌文件, 這樣生成新的日誌文件並且經常拋棄老的.

如果您簡單地把postmasterstderr定向到一個文件中, 您會有日誌輸出, 但是截斷日誌文件的唯一的方法是停止並重起postmaster。 這樣做對於開發環境中使用 PostgreSQL 可能是可以的,但是您肯定不想在生產環境上這麼幹。

一個更好的辦法是把 postmasterstderr 輸出發送到某種日誌旋轉程序裡。 我們有一個內置的日誌旋轉程序,您可以透過在 postgresql.conf 裡設置配置參數 redirect_stderrtrue 的辦法打開它。這個程序的控制參數在 Section 16.4.6.1 裡描述。

另外,您可能會覺得把 postmasterstderr 輸出給某些日誌旋轉腳本會更好些,特別是您已經在其它伺服器上用了這個程序的時候。 比如,包含在 Apache 發佈裡的 rotatelogs 工具就可以用於 PostgreSQL。 要這麼做,只需要把 postmasterstderr 重定向到指定程序。 如果您用 pg_ctl 啟動伺服器,那麼 stderr 已經重定向到 stdout, 因此您只需要一個管道命令,比如:

pg_ctl start | rotatelogs /var/log/pgsql_log 86400

另外一種生產級的管理日誌輸出的方法就是把它們發送給 syslog,讓 syslog 處理文件旋轉。 要利用這個工具,我們需要設置 postgresql.conf 裡的 log_destination 配置參數設置為 syslog (記錄 syslog 日誌)。 然後在您想強迫 syslog 守護進程開始寫入一個新日誌文件的時候, 您就可以發送一個 SIGHUP 信號給它。 如果您想自動旋轉日誌文件,那麼我們可以配置 logrotate 程序處理 syslog 的日誌文件。

不過,在很多系統上,syslog 不是非常可靠,特別是在大型日誌訊息的情況下; 它可能在您最需要那些訊息的時候截斷或者丟棄它們。 還有,在 linux 上,syslog 會把每個消息刷新到磁盤上, 導致很惡劣的性能。 (您可以在 syslog 配置文件裡面的文件名開頭使用一個 - 來關閉這個行為。)

請注意上面描述的所有解決方案關注的是在可配置的間隔上開始一個新的日誌文件, 它們並沒有處理刪除舊的,不再需要的日誌文件的事情。您可能還需要設置一個批處理,週期地刪除舊日誌文件。 另外一個可能的解法是配置日誌旋轉程序,讓它週期地覆蓋舊的日誌文件。