如何将 PostgreSQL 表数据更改记录到 syslog 中?

如何将 PostgreSQL 表数据更改记录到 syslog 中?

我有一个使用这些表的程序,我想在不修改程序的情况下向其日志记录添加一些附加功能。

groups
------
id bigint not null
name character varying(100) not null

users
-----
id bigint not null
name character varying(100) not null

users_groups
------------
group_id bigint not null
user_id bigint not null

每次从组中添加或删除用户时,我想在 syslog6 中写入“user123 添加到 group456”或“user123 从 group456 中删除”消息。

我的第一个想法是使用 PostgreSQL 触发器。

CREATE OR REPLACE FUNCTION process_ext_audit() 
    RETURNS trigger AS $ext_audit$
BEGIN
        IF (TG_OP = 'DELETE') THEN
            SELECT name 
                into uname
            FROM users
            WHERE id = OLD.user_id;

            SELECT name 
                into gname
            FROM groups
            WHERE id = OLD.group_id;

            -- write into local6: "uname removed from gname"
        ELSIF (TG_OP = 'INSERT') THEN
            SELECT name 
                into uname
            FROM users
            WHERE id = NEW.user_id;

            SELECT name 
                into gname
            FROM groups
            WHERE id = NEW.group_id;

            -- write into local6: "uname added to gname"
        END IF;
        RETURN NULL;
END;
$ext_audit$ LANGUAGE plpgsql;

CREATE TRIGGER ext_audit
AFTER INSERT OR DELETE ON users_groups
    FOR EACH ROW EXECUTE PROCEDURE process_ext_audit();

我的方法好不好?如果是,我如何从这个函数写入系统日志?

我将 postgresql 9.2 与使用 rsyslog 的 CentOS 7 一起使用。

答案1

如果您已正确配置日志记录(请参阅选项18.8.2. When To Log. PostgreSQL:文档:9.1:错误报告和日志记录 | postgresql.org)并且您的日志目的地是 syslog,那么您可以用来RAISE记录某些内容。更多信息可以在这里找到:PostgreSQL:文档:8.3:错误和消息 | postgresql.org

答案2

据我所知,没有直接的方法从触发器生成系统日志消息,但您可以考虑使用外部程序来完成此任务。但请参阅:从 PostgreSQL 触发器调用外部程序如果您考虑触发器内的外部程序。如果您将消息插入数据库内的审核表并创建一个额外的任务(轮询:-( 来检查“添加或删除用户”等事件),就会有一个选项。

相关内容