PostgreSQL日志分析:将CSV日志导入到表中

像其它数据库一样,PostgreSQL也有自己的日志系统,postgresql 日志方面有非常全面的设置参数,这篇不准备仔细的介绍PG的日志参数,只介绍日志分析的一种方法,即可以将日志文件内容导入到数据库表里,便于分析日志。

CSV日志文件目录

日志的目录可以通过参数 log_directory 来设置,下面是我的参数设置。

1
log_directory = '/var/applog/pg_log'

查看日志文件

1
2
3
4
5
[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日志文件内容

1
2
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日志导入数据库表

调整 postgresql.conf 参数,如下:

1
2
log_destination = 'csvlog'  
logging_collector = on

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

创建日志记录表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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日志数据。

导入操作系统 csv 日志到表 postgres_log 表

1
2
3
4
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 连接到目标库。

常用日志分析SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html

PostgreSQL实战
感谢支持!
0%