【发布时间】:2020-10-13 11:59:24
【问题描述】:
我有来自各种 linux 服务器的日志,它们由 rsyslog 馈送到 PostgreSQL 数据库。传入的时间戳是 rsyslog 的 RFC3339 格式时间,如下所示:2020-10-12T12:01:18.162329+02:00。
在数据库日志记录表的原始测试设置中,我将该时间戳字段创建为“文本”。我需要解析的大多数东西都可以正常工作,所以我希望将时间戳表列从文本转换为时间戳数据类型(并尽可能保留亚秒和时区)。
最终结果应该是时间戳数据类型,以便我可以使用 PostgreSQL 数据函数进行日期范围查询。
这在 PostgreSQL 11 中可行吗?还是以正确的时间戳列数据类型重新创建表更好?
提前感谢您提供任何指针、建议、查看地点或代码的 sn-ps。
相关rsyslog配置:
$template CustomFormat,"%timegenerated:::date-rfc3339% %syslogseverity-text:::uppercase% %hostname% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate CustomFormat
...
template(name="rsyslog" type="list" option.sql="on") {
constant(value="INSERT INTO log (timestamp, severity, hostname, syslogtag, message)
values ('")
property(name="timegenerated" dateFormat="rfc3339") constant(value="','")
property(name="syslogseverity-text" caseConversion="upper") constant(value="','")
property(name="hostname") constant(value="','")
property(name="syslogtag") constant(value="','")
property(name="msg") constant(value="')")
}
以及日志表结构:
CREATE TABLE public.log
(
id integer NOT NULL DEFAULT nextval('log_id_seq'::regclass),
"timestamp" text COLLATE pg_catalog."default" DEFAULT timezone('UTC'::text, CURRENT_TIMESTAMP),
severity character varying(10) COLLATE pg_catalog."default",
hostname character varying(20) COLLATE pg_catalog."default",
syslogtag character varying(24) COLLATE pg_catalog."default",
program character varying(24) COLLATE pg_catalog."default",
process text COLLATE pg_catalog."default",
message text COLLATE pg_catalog."default",
CONSTRAINT log_pkey PRIMARY KEY (id)
)
【问题讨论】:
标签: postgresql rsyslog timestamp-with-timezone