PostgreSQL記錄SQL日誌的參數有三個,如下,這三個參數都可以記錄某種日誌,也可以單獨設置,也可以相互設置,因此情況比較多,某些情況下會生成一些奇怪的日誌內容,需要弄清楚每一個參數的具體含義,有助於做出合理的配置
1,log_duration = on|off;
2,log_statement='none|ddl|mod|all';
3,log_min_duration_statement = N
log_duration
對於log_duration,這個參數僅僅是一個開關,決定是否記錄所有SQL耗時的開關,記住是“是否記錄SQL耗時的開關,不記錄SQL語句本身”。
打開之後會記錄所有SQL的執行的耗時,但不會記錄SQL語句自身,所以日誌文件中會記錄到一些只有執行時間的奇怪的日誌,
諸如此類:2025-08-01 06:25:38.391 CST [371967] user=postgres,db=db02,app=DBeaver 25.1.0 - Main <db02>,host=123.*.*.186 LOG: duration: 0.042 ms
是的,沒有弄錯,該日誌表明,某個SQL執行耗時0.042毫秒,只有這個信息,沒有記錄具體的SQL
該參數更多的是臨時性調試的時候打開使用,而不能作為常規日誌記錄,這樣會生成海量的日誌,意義不大
log_statement
log_statement參數用於控制SQL語句日誌記錄的參數,主要用於審計和調試目的,該參數只記錄符合參數的SQL語句本身,但不包括執行時間
1,none :不記錄任何SQL語句(默認值)。
2,ddl:僅記錄DDL語句:如CREATE、ALTER、DROP等。
3,mod:記錄所有寫入操作:包括INSERT、UPDATE、DELETE、TRUNCATE,以及所有DDL語句。
4,all:記錄所有SQL語句,包括SELECT在內。
假設需要記錄實例上的寫入SQL,以及執行時間,那麼需要打開log_durtion=on,並且設置log_statement='mod',這樣就能記錄下所有的寫操作,以及執行時間
該參數更多的是記錄某些特殊的審計日誌,比如ddl日誌,或者臨時性記錄某些日誌,如果設置為all,會生成海量的日誌
log_min_duration_statement
該參數是PostgreSQL的慢查詢閾值,默認值是-1,也即不記錄任何sql語句,如果打開這隻,其單位是毫秒,就是説一旦某個SQL實踐實踐超過這個參數定義的值,就會被記錄下來。該參數不依賴於log_duration,也即記錄下來慢SQL的執行時間。
PostgreSQL中以上三個參數都可以記錄某些SQL日誌,在實際的使用過程中需要弄清楚其配置意義。