本文介绍如何通过日志服务控制台创建Logtail采集配置来采集PostgreSQL查询结果。
前提条件
- 已在服务器上安装Linux Logtail 1.2.1及以上版本。更多信息,请参见安装Logtail(Linux系统)。重要 请确保用于安装Logtail的服务器可连接目标数据库。
- 在PostgreSQL数据库中,设置白名单为Logtail所在服务器的IP地址。
例如RDS PostgreSQL数据库的白名单设置,请参见设置白名单。
原理
Logtail根据Logtail采集配置定期执行指定的SELECT语句,将查询结果作为数据上传到日志服务。
Logtail获取到查询结果时,会将结果中的CheckPoint字段保存到本地。当下次执行SELECT语句时,会将上一次保存的CheckPoint带入到SELECT语句中,以此实现增量数据采集。

功能
- 支持采集PostgreSQL数据库的查询结果。
- 支持分页设置。
- 支持时区设置。
- 支持超时设置。
- 支持保存CheckPoint状态。
- 支持限制每次最大采集数量。
应用场景
- 根据数据中的自增ID或时间等标志采集增量数据。
- 根据筛选条件自定义同步。
操作步骤
- 登录日志服务控制台。
- 在接入数据区域,选择自定义数据插件。
- 选择目标Project和Logstore,单击下一步。
- 在创建机器组页签中,创建机器组。
- 如果您已有可用的机器组,请单击使用现有机器组。
- 如果您还没有可用的机器组,请执行以下操作(以ECS为例)。
- 在ECS机器页签中,通过手动选择实例方式选择目标ECS实例,单击创建。
更多信息,请参见安装Logtail(ECS实例)。
重要- 如果您的服务器是与日志服务属于不同账号的ECS、其他云厂商的服务器和自建IDC时,您需要手动安装Logtail。更多信息,请参见安装Logtail(Linux系统)。
- 手动安装Logtail后,您还需要在该服务器上手动配置用户标识。具体操作,请参见配置用户标识。
- 安装完成后,单击确认安装完毕。
- 在创建机器组页面,输入名称,单击下一步。
日志服务支持创建IP地址机器组和用户自定义标识机器组,详细参数说明请参见创建IP地址机器组和创建用户自定义标识机器组。
- 在ECS机器页签中,通过手动选择实例方式选择目标ECS实例,单击创建。
- 选中目标机器组,将该机器组从源机器组移动到应用机器组,单击下一步。
- 在数据源设置页签中,设置配置名称和插件配置,单击下一步。
- inputs为数据源配置,必选项。 重要 一个inputs中只允许配置一个类型的数据源。
- processors为处理配置,用于解析数据,例如提取字段、提取日志时间、脱敏数据、过滤日志等。可选项,您可以配置一种或多种处理方式。更多信息,请参见概述。
{ "inputs": [ { "type": "service_pgsql", "detail": { "Address": "pgm-****.pg.rds.aliyuncs.com", "User": "****", "Password": "*******", "DataBase": "****", "Limit": true, "PageSize": 100, "StateMent": "select * from specialalarmtest where id > $1 order by id", "CheckPoint": true, "CheckPointColumn": "id", "CheckPointStart": "0", "CheckPointSavePerPage": true, "CheckPointColumnType": "int", "IntervalMs": 1000 } } ] }
参数 类型 是否必选 说明 type string 是 数据源类型,固定为service_pgsql。 Address string 否 PostgreSQL地址。例如 pgm-****.pg.rds.aliyuncs.com
。不配置时,默认使用127.0.0.1:5432。
User string 否 用于登录PostgreSQL数据库的账号名称。 不配置时,默认使用root。
Password string 否 用于登录PostgreSQL数据库的账号密码。不配置时,默认为空。 如果安全需求较高,建议将用户名和密码配置为xxx
,待采集配置同步至本地机器后,在本地文件/usr/local/ilogtail/user_log_config.json找到对应配置进行修改。具体操作,请参见修改本地配置。重要 如果您在控制台上修改了此参数,同步至本地后会覆盖当前本地的配置。DataBase string 否 PostgreSQL数据库名称。 DialTimeOutMs int 否 连接PostgreSQL数据库超时时间,单位:ms。 不配置时,默认使用5000 ms。
ReadTimeOutMs int 否 读取PostgreSQL查询结果的超时时间,单位:ms。 不配置时,默认使用5000 ms。
StateMent string 否 SELECT语句。 设置CheckPoint为true时,StateMent中SELECT语句的where条件中必须包含CheckPoint列(CheckPointColumn参数),并将该列的值设置为$1。例如:设置CheckPointColumn为id,设置StateMent为
SELECT * from ... where id > $1
。Limit boolean 否 是否使用Limit分页。 不配置时,默认使用false,表示不使用Limit分页。
建议使用Limit进行分页。设置Limit为true后,进行SQL查询时,会自动在StateMent中追加LIMIT语句。
PageSize int 否 分页大小,Limit为true时必须配置。 MaxSyncSize int 否 每次同步最大记录数。 不配置时,默认使用0,表示无限制。
CheckPoint boolean 否 是否使用CheckPoint。 不配置时,默认使用false,表示不使用CheckPoint。
CheckPointColumn string 否 CheckPoint列名称。 CheckPoint为true时必须配置。警告 该列的值必须递增,否则可能会出现数据漏采集问题(每次查询结果中的最大值将作为下次查询的输入)。CheckPointColumnType string 否 CheckPoint列的数据类型,支持int和time。int类型的内部存储为int64,time类型支持PostgreSQL的时间类型。 CheckPoint为true时必须配置。
CheckPointStart string 否 CheckPoint列的初始值。 CheckPoint为true时必须配置。
CheckPointSavePerPage boolean 否 是否每次分页时保存一次CheckPoint。 - true:每次分页时保存一次CheckPoint。
- false:每次同步完成后保存一次CheckPoint。
IntervalMs int 是 同步间隔,单位:ms。 - inputs为数据源配置,必选项。
- 预览数据及创建索引,然后单击下一步。日志服务默认开启全文索引。您也可以根据采集到的日志,手动创建字段索引,或者单击自动生成索引,日志服务将自动生成字段索引。更多信息,请参见创建索引。重要 如果您要查询和分析日志,那么全文索引和字段索引必须至少启用一种。同时启用时,以字段索引为准。
- 单击查询日志,系统将跳转至Logstore查询分析页面。您需要等待1分钟左右,待索引生效后,才能在原始日志页签中,查看已采集到的日志。更多信息,请参见查询和分析日志。
修改本地配置
如果您没有在插件配置中输入真实的Address、User、Password等信息,可以在采集配置下发到本地后进行手动修改。
- 登录Logtail所在服务器。
- 打开/usr/local/ilogtail/user_log_config.json文件,找到service_pgsql关键字,修改Address、User、Password等字段。
- 执行以下命令重启Logtail。
sudo /etc/init.d/ilogtaild stop; sudo /etc/init.d/ilogtaild start
问题排查
使用Logtail采集日志后,如果预览页面或查询页面无数据,您可以参见Logtail采集日志失败的排查思路进行排查。
数据库表和日志样例
- 表结构样例
//创建表。 CREATE TABLE IF NOT EXISTS specialalarmtest ( id BIGSERIAL NOT NULL, time TIMESTAMP NOT NULL, alarmtype varchar(64) NOT NULL, ip varchar(16) NOT NULL, COUNT INT NOT NULL, PRIMARY KEY (id) ); //插入数据。 insert into specialalarmtest (time, alarmtype, ip, count) values(now(), 'NO_ALARM', '10.10.***.***', 0); insert into specialalarmtest (time, alarmtype, ip, count) values(now(), 'NO_ALARM', '10.10.***.***', 1); insert into specialalarmtest (time, alarmtype, ip, count) values(now(), 'NO_ALARM', '10.10.***.***', 2); insert into specialalarmtest (time, alarmtype, ip, count) values(now(), 'NO_ALARM', '10.10.***.***', 3);
- 日志样例