PostgreSQL日志文件配置

2024年 1月 26日 49.7k 0

为了更详细的记录PostgreSQL的运行日志,我们一般需要修改PostgreSQL默认的配置文件,这里不念整理了一些常用的配置

图片[1]-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) 语句的日志,例如 CREATEALTER 和 DROP 等语句。
  • mod:记录数据修改语言 (DML) 语句的日志,例如 INSERTUPDATE 和 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 参数将日志目录映射到主机上的目录,以便能够轻松访问日志文件。

    相关文章

    pt-kill工具的使用
    pt-ioprofile工具包的使用
    数据库管理-第216期 Oracle的高可用-01(20240703)
    DBMS_REPAIR EXAMPLE SCRIPT WITH PARTITION
    数据库事务的四大特性: ACID 
    使用BBED修复损坏的SYSTEM文件头

    发布评论