PostgreSQL日志配置記錄


日志審計 

審計是值記錄用戶的登陸退出以及登陸后在數據庫里的行為操作,可以根據安全等級不一樣設置不一樣級別的審計, 

此處涉及的參數文件有:

 

logging_collector      --是否開啟日志收集開關,默認off,開啟要重啟DB

log_destination    --日志記錄類型,默認是stderr,只記錄錯誤輸出

log_directory      --日志路徑,默認是$PGDATA/pg_log, 這個目錄最好不要和數據文件的目錄放在一起, 目錄需要給啟動postgres的操作系統用戶寫權限.

log_filename       --日志名稱,默認是postgresql-%Y-%m-%d_%H%M%S.log

log_file_mode   --日志文件類型,默認為0600

log_truncate_on_rotation  --默認為off,設置為on的話,如果新建了一個同名的日志文件,則會清空原來的文件,再寫入日志,而不是在后面附加。

log_rotation_age   --保留單個文件的最大時長,默認是1d,也有1h,1min,1s,個人覺得不實用

log_rotation_size  --保留單個文件的最大尺寸,默認是10MB

log_error_verbosity --默認為default,verbose表示冗長的

log_connections    --用戶session登陸時是否寫入日志,默認off

log_disconnections --用戶session退出時是否寫入日志,默認off

 

 

【推薦的日志配置】

logging_collector = on
log_destination = 'csvlog'
log_truncate_on_rotation = on
log_connections = off
log_disconnections = off
log_error_verbosity = verbose
log_statement = ddl
log_min_duration_statement = 3s
log_checkpoints = on
log_lock_waits = on
deadlock_timeout = 1s

 

1.記錄級別

記錄用戶登陸數據庫后的各種操作,postgres日志里分成了3類,通過參數pg_statement來控制,默認的pg_statement參數值是none,即不記錄,可以設置ddl(記錄create,drop和alter)、mod(記錄ddl+insert,delete,update和truncate)和all(mod+select)。

 

log_statement = ddl

 

一般的OLTP系統審計級別設置為ddl就夠了,因為記錄輸出各種SQL對性能的影響還是蠻大的,安全級別高一點的也可以設置mod模式,有條件也可以不在數據庫層面做,而是購買設備放在網絡層監控解析。

 

如果這里設置為none,在 log_min_duration_statement設置為60s,那么log_min_duration_statement也會生效,將執行時間超過60s的SQL打印到日志。

 

按不同情況進行配置審計級別:

1)審計用戶hm連到數據庫hm 的所有SQL.

alter role hm in database hm set log_statement='all';

2) 審計用戶hm 的所有SQL.

alter role hm set log_statement='all';

3) 審計任何用戶連接到數據庫hm 的所有SQL.

 alter database hm set log_statement='all';

 

 

2.定位慢查詢SQL 

可以設置一定時長的參數(log_min_duration_statement),來記錄超過該時長的所有SQL,對找出當前數據庫的慢查詢很有效。 比如log_min_duration_statement = 2s,記錄超過2秒的SQL,改完需要reload 

 

log_min_duration_statement = 2s

 

3.監控數據庫的checkpoint 

當數據庫進行一項大更新操作時,如果參數設置不當,會在日志里留下大量的告警信息,頻繁的做checkpoint會導致系統變慢,不用設置都會有。

但是不會記錄系統正常的checkpoint,如果你想看系統一天之類發生了多少次checkpoint,以及每次checkpoint的一些詳細信息,比如buffer,sync等,就可以通過設置log_checkpoints,該參數默認值是off。

 

log_checkpoints = on 

 

4.監控數據庫的鎖 

數據庫的鎖通常可以在pg_locks這個系統表里找,但這只是當前的鎖表/行信息,如果你想看一天內有多少個超過死鎖時間的鎖發生,可以在日志里設置並查看,log_lock_waits 默認是off,可以設置開啟。這個可以區分SQL慢是資源緊張還是鎖等待的問題。

log_lock_waits=on

deadlock_timeout=1

還有一些Debug功能,適合修改源碼調試,一般的的系統上並不需要,暫時比較關注的就這些。

 

5.可以在表上設置觸發器,來審計

 

6.可以使用插件pg_log_userqueries 來做,沒有必要

 

【注意事項】

1. 超級用戶可以修改這些配置項, 所以被審計的用戶最好是普通用戶. 否則用戶連上來可以修改這些審計項.

2. 程序用的數據庫賬號和個人用的數據庫賬號分開, 對於程序用的數據庫賬號可以只審計DDL操作, 而對於個人使用的數據庫賬號, 建議審計所有的SQL.

3. 變量優先級(事務>會話>database/role>啟動參數>配置文件) 

某些全局變量可以動態修改,例如本文提到的log_statement。修改后reload之后,所有會話都會讀到最新的變量

 

2020-03-26補充:

為了讓日志文件自動覆蓋,達到保留多少日志的目的,可以進行如下設置:

log_truncate_on_rotation = on

log_filename = 'postgresql-%I.log' #最多保存12小時的日志,每小時一個文件
log_filename = 'postgresql-%H.log' #最多保存24小時的日志,每小時一個文件
log_filename = 'postgresql-%w.log' #最多保存一周的日志,每天一個文件
log_filename = 'postgresql-%d.log' #最多保存一個月的日志,每天一個文件
log_filename = 'postgresql-%j.log' #最多保存一年的日志,每天一個文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM