为了更详细的记录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,所以要将修改后的配置文件同步到容器内部
拷贝配置到容器
dockercp /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。
模拟测试数据
创建表
DROPTABLEIFEXISTS"public"."student";CREATETABLE"public"."student"("student_id" int4 NOTNULL,"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");COMMENTONCOLUMN"public"."student"."student_id"IS'学生id';COMMENTONCOLUMN"public"."student"."name"IS'姓名';COMMENTONCOLUMN"public"."student"."age"IS'年龄';COMMENTONCOLUMN"public"."student"."gender"IS'性别';COMMENTONCOLUMN"public"."student"."address"IS'地址';COMMENTONCOLUMN"public"."student"."phone"IS'电话';COMMENTONCOLUMN"public"."student"."grade"IS'年级';ALTERTABLE"public"."student"ADDCONSTRAINT"student_pkey"PRIMARYKEY("student_id");
写入数据
INSERTINTO"public"."student"VALUES(1,'John Doe',21,'Male','Beijing','1234567890','Grade 10');INSERTINTO"public"."student"VALUES(2,'Jane Smith',19,'Female','Shanghai','0987654321','Grade 11');INSERTINTO"public"."student"VALUES(3,'Mike Johnson',18,'Male','Guangzhou','9876543210','Grade 12');
查看日志
使用Docker启动的PostgreSQL数据库,查看日志需要先进入到容器内部,找到对应的日志文件,才能查看。
列出正在运行的 Docker容器
dockerps
找到正在运行的 PostgreSQL 容器的 CONTAINER ID 或名称。
进入正在运行的 PostgreSQL 容器的 shell
dockerexec-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
参数将日志目录映射到主机上的目录,以便能够轻松访问日志文件。
版权归原作者 IT后浪 所有, 如有侵权,请联系我们删除。