為了更詳細的記錄PostgreSQL 的運行日志,我們一般需要修改PostgreSQL 默認的配置文件,這里整理了一些常用的配置
修改配置文件
打開 PostgreSQL 配置文件 postgresql.conf
。該文件通常位于 PostgreSQL 安裝目錄下的 data
文件夾中。
找到并修改以下配置項:
logging_collector = on
log_statement = 'all'
log_duration = on
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 1
配置文件解釋
啟用日志收集器
logging_collector = on
記錄所有的 SQL 語句,包括查詢和修改
log_statement = 'all'
log_statement
有以下幾個參數:
none
:不記錄任何 SQL 語句的日志。這是默認值。ddl
:僅記錄數據定義語言 (DDL) 語句的日志,例如CREATE
、ALTER
和DROP
等語句。mod
:記錄數據修改語言 (DML) 語句的日志,例如INSERT
、UPDATE
和DELETE
等語句。all
:記錄所有 SQL 語句的日志,包括 DDL、DML 和查詢語句。
通過設置不同的參數,您可以控制要記錄的 SQL 語句類型的詳細程度。例如,如果只對數據修改語句感興趣,可以將 log_statement
設置為 mod
。如果希望記錄所有 SQL 語句,包括查詢語句,可以將 log_statement
設置為 all
。
記錄每個 SQL 語句的執行時間
log_duration = on
記錄日志格式設置
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
它可以包含以下參數,每個參數都表示不同的含義:
%a
:當前會話的應用名稱。%u
:當前會話的用戶名。%d
:當前數據庫的名稱。%r
:當前會話的遠程主機地址。%p
:當前會話的進程 ID。%t
:當前時間戳。%m
:當前會話的日志消息類型。%s
:當前會話的會話 ID。%i
:當前會話的事務 ID。%e
:當前會話的錯誤代碼。%c
:當前會話的命令標識符。
您可以根據需要自定義 log_line_prefix
的配置,以滿足您對日志行格式的要求。要更改 log_line_prefix
的值,可以編輯 PostgreSQL 配置文件 postgresql.conf
,找到 log_line_prefix
配置項并將其設置為所需的值。然后重新啟動 PostgreSQL 服務以使更改生效。
記錄每個連接的建立和關閉
log_connections = on
記錄每個連接的斷開
log_disconnections = on
記錄等待鎖的查詢
log_lock_waits = on
記錄臨時文件的創建和刪除
log_temp_files = 1
PostgreSQL log_temp_files
是一個配置項,用于控制是否記錄臨時文件的創建和刪除操作的日志。它有以下幾個參數:
0
:不記錄臨時文件的日志。這是默認值。1
:記錄臨時文件的創建和刪除操作的日志。-1
:將臨時文件的日志記錄級別設置為與log_statement
相同的級別。
對 log_temp_files
參數的進一步解釋:
- 當
log_temp_files
設置為0
時,不會記錄任何臨時文件的日志。 - 當
log_temp_files
設置為1
時,會記錄臨時文件的創建和刪除操作的日志。 - 當
log_temp_files
設置為-1
時,它會繼承log_statement
的值,即根據log_statement
的設置來決定是否記錄臨時文件的日志。如果log_statement
設置為none
,則不會記錄臨時文件的日志;如果log_statement
設置為all
或ddl
,則會記錄臨時文件的日志。
修改配置文件
由于本次測試是使用Docker啟動的PostgreSQL,所以要將修改后的配置文件同步到容器內部
拷貝配置到容器
docker cp /opt/postgresql.conf postgresql:/var/lib/postgresql/data
以下是對 docker cp
命令中各個參數的含義的解釋:
/opt/postgresql.conf
:這是主機系統上的源文件路徑,表示要復制的文件的位置和名稱。在這個例子中,它是 PostgreSQL 的配置文件路徑。postgresql
:這是容器的名稱或 ID,表示要將文件復制到哪個容器內部。/var/lib/postgresql/data
:這是容器內部的目標路徑,表示要將文件復制到容器內部的哪個位置。在這個例子中,它是 PostgreSQL 容器內部的數據目錄路徑。
通過執行 docker cp
命令,可以將主機系統上的 PostgreSQL 配置文件拷貝到運行中的 PostgreSQL 容器內部,以便在容器中使用該配置文件進行配置和設置。
重啟使其生效
docker restart postgresql
在這個命令中,postgresql
是容器的名稱或 ID。
模擬測試數據
創建表
DROP TABLE IF EXISTS "public"."student";
CREATE TABLE "public"."student" ("student_id" int4 NOT NULL,"name" varchar(255) COLLATE "pg_catalog"."default","age" int4,"gender" varchar(255) COLLATE "pg_catalog"."default","address" varchar(255) COLLATE "pg_catalog"."default","phone" varchar(255) COLLATE "pg_catalog"."default","grade" varchar(255) COLLATE "pg_catalog"."default"
);
COMMENT ON COLUMN "public"."student"."student_id" IS '學生id';
COMMENT ON COLUMN "public"."student"."name" IS '姓名';
COMMENT ON COLUMN "public"."student"."age" IS '年齡';
COMMENT ON COLUMN "public"."student"."gender" IS '性別';
COMMENT ON COLUMN "public"."student"."address" IS '地址';
COMMENT ON COLUMN "public"."student"."phone" IS '電話';
COMMENT ON COLUMN "public"."student"."grade" IS '年級';ALTER TABLE "public"."student" ADD CONSTRAINT "student_pkey" PRIMARY KEY ("student_id");
寫入數據
INSERT INTO "public"."student" VALUES (1, 'John Doe', 21, 'Male', 'Beijing', '1234567890', 'Grade 10');
INSERT INTO "public"."student" VALUES (2, 'Jane Smith', 19, 'Female', 'Shanghai', '0987654321', 'Grade 11');
INSERT INTO "public"."student" VALUES (3, 'Mike Johnson', 18, 'Male', 'Guangzhou', '9876543210', 'Grade 12');
查看日志
使用Docker啟動的PostgreSQL數據庫,查看日志需要先進入到容器內部,找到對應的日志文件,才能查看。
列出正在運行的 Docker容器
docker ps
找到正在運行的 PostgreSQL 容器的 CONTAINER ID 或名稱。
進入正在運行的 PostgreSQL 容器的 shell
docker exec -it <CONTAINER_ID_OR_NAME> /bin/sh
將 <CONTAINER_ID_OR_NAME>
替換為實際的 CONTAINER ID 或名稱。
進入 PostgreSQL 數據目錄
cd /var/lib/postgresql/data
這是默認的 PostgreSQL 數據目錄。
使用以下命令查看日志文件
tail -f pg_log/postgresql-<DATE>_<TIME>.log
將 <DATE>
和 <TIME>
替換為實際的日志文件日期和時間。
例如,要查看名為 postgresql-2022-01-01_120000.log
的日志文件,可以運行以下命令:
tail -f pg_log/postgresql-2022-01-01_120000.log
這將以實時方式顯示日志文件的內容。
如果在 Docker 啟動 PostgreSQL 容器時未將日志目錄映射到主機上的目錄,您將無法直接在主機上查看日志文件。在啟動容器時,可以使用 -v
參數將日志目錄映射到主機上的目錄,以便能夠輕松訪問日志文件。