postgresql 日志配置

本文介绍如何配置PostgreSQL的pg_log日志,并通过示例展示如何将CSV日志导入数据库表进行分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PostgreSQL有3种日志,分别是pg_log(数据库运行日志)、pg_xlog(WAL 日志,即重做日志)、pg_clog(事务提交日志,记录的是事务的元数据)


pg_log默认是关闭的,需要设置参数启用此日志。pg_xlog和pg_clog都是强制打开的,无法关闭。






1.启用pg_log并配置日志参数
log_destination = 'csvlog'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_min_messages = info
# 记录执行慢的SQL
log_min_duration_statement = 60
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = on
log_line_prefix = '%m'
# 监控数据库中长时间的锁
log_lock_waits = on
# 记录DDL操作
log_statement = 'ddl'


2.重启PostgreSQL即可在$PGDATA/pg_log/ 下看到新生成的日志。

pg_ctl restart -m fast


--日志文件目录   
   日志的目录可以通过参数  log_directory 来设置,下面是我的参数设置。
   log_directory = '/var/applog/pg_log'  
    
[postgres@pg_log]$ ll /var/applog/pg_log    
-rw------- 1 postgres postgres 4.8M Mar 14 23:57 postgresql-2011-03-14_000000.csv
-rw------- 1 postgres postgres    0 Mar 14 00:00 postgresql-2011-03-14_000000.log
-rw------- 1 postgres postgres 294K Mar 15 15:10 postgresql-2011-03-15_000000.csv
-rw------- 1 postgres postgres    0 Mar 15 00:00 postgresql-2011-03-15_000000.log

--CSV日志文件内容
2011-03-15 00:07:03.513 CST,"wapportal","wapportal_216",4137,"172.16.3.43:59356",4d7e361f.1029,3,"idle",2011-03-14 23:37:03 CST,,0,LOG,00000,"disconnection: session time: 0:30:00.086 user=wapportal database=wapportal_216 host=172.16.3.43 port=59356",,,,,,,,,""
2011-03-15 00:07:03.514 CST,,,5173,"",4d7e3d27.1435,1,"",2011-03-15 00:07:03 CST,,0,LOG,00000,"connection received: host=172.16.3.43 port=51135",,,,,,,,,""

   上面两条是 postgresql-2011-03-15_000000.csv 日志文件的部分内容 ,由于日志文件的可读性
 较差,于是可以通过下面方法将CSV日志导入到数据库表里。详细如下

 
将CSV日志导入数据库表里   
1--调整参数
log_destination = 'csvlog'
logging_collector = on

    这两个参数修改后,PG SERVER 需要重启。

2--创建日志记录表
CREATE TABLE postgres_log
(
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  PRIMARY KEY (session_id, session_line_num)
);

NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "postgres_log_pkey" for table "postgres_log"
CREATE TABLE;

    备注:创建日志表 postgres_log 用来保存 CSV日志数据。

3--导入操作系统 csv 日志到表 postgres_log 表
skytf=# copy skytf.postgres_log from '/var/applog/pg_log/postgresql-2011-03-14_000000.csv' with csv;
COPY 26031

skytf=# copy skytf.postgres_log from '/var/applog/pg_log/postgresql-2011-03-15_000000.csv' with csv;
COPY 1297

      备注:文件形式导入导出数据需要以超级用户 postgres 连接到目标库。

4--常用日志分析sql
skytf=# select min(log_time),max(log_time) from skytf.postgres_log;
            min             |            max             
----------------------------+----------------------------
 2011-03-14 14:04:07.275+08 | 2011-03-16 05:04:34.427+08
(1 row)

skytf=> select log_time,database_name,user_name,application_name,message from postgres_log where message like '%duration%';
          log_time          | database_name | user_name | application_name |                                                    mess
age                                                    
----------------------------+---------------+-----------+------------------+--------------------------------------------------------
-------------------------------------------------------
 2011-03-15 00:23:38.957+08 | db_lbs        | lbs       |                  | duration: 1297.440 ms  execute <unnamed>:    SELECT cit
yname,province,the_geom as the_geom FROM china_city   
.......
    
       为了显示方便,上面只取一条记录。


### 配置和查看 PostgreSQL 日志文件 #### 1. 启用日志收集器 为了启用 PostgreSQL日志功能,需要调整 `logging_collector` 参数。该参数用于开启或关闭日志收集器的功能。将其设置为 `on` 可以启动日志记录[^2]。 ```plaintext logging_collector = on ``` #### 2. 设置日志存储路径 默认情况下,PostgreSQL日志文件会保存在数据目录下的 `pg_log` 文件夹中。可以通过修改 `log_directory` 和 `log_filename` 参数来自定义日志的位置和命名方式[^3]。 - **log_directory**: 定义日志文件所在的子目录,默认值为 `pg_log`。 - **log_filename**: 定义日志文件的名称模式,通常包含日期和时间戳。 示例配置如下: ```plaintext log_directory = 'pg_log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' ``` #### 3. 查看日志文件内容 要实时监控日志文件的内容,可以使用 Linux 命令 `tail -f` 来跟踪最新的日志条目。假设日志文件位于 `$PGDATA/pg_log/` 路径下,则执行以下命令可动态显示日志更新情况[^1]。 ```bash tail -f $PGDATA/pg_log/postgresql-<DATE>_<TIME>.log ``` #### 4. 重启服务使配置生效 完成上述配置后,需重新启动 PostgreSQL 服务以应用新的日志设置。推荐使用快速重启选项 `-m fast` 减少停机时间。 ```bash pg_ctl restart -m fast ``` #### 5. 关于 WAL (Write-Ahead Logging) 日志 除了常规的操作日志外,PostgreSQL 还维护了一种称为 Write-Ahead Logging (WAL) 的机制。这些日志文件存放在 `pg_xlog` 或者更现代版本中的 `pg_wal` 目录下。它们主要用于事务持久化、崩溃恢复以及逻辑复制等功能[^5]。 需要注意的是,WAL 日志文件对于数据库的一致性和可用性至关重要,因此不应随意删除或移动这些文件。 --- ### 示例代码:验证日志配置并读取最新日志 以下是通过脚本检查当前日志状态并打印最近几行日志的方法。 ```python import os from datetime import datetime def check_postgres_logs(pgdata_path): log_dir = os.path.join(pgdata_path, "pg_log") latest_file = max([os.path.join(log_dir, f) for f in os.listdir(log_dir)], key=os.path.getctime) with open(latest_file, 'r') as file: lines = file.readlines()[-10:] # 获取最后十行日志 return "\n".join(lines) if __name__ == "__main__": PGDATA_PATH = "/path/to/your/pgdata" print(check_postgres_logs(PGDATA_PATH)) ``` 此 Python 脚本可以帮助定位最新的日志文件,并提取其中的部分内容以便分析。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值