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에 "group456에 추가된 user123" 또는 "group456에서 제거된 user123" 메시지를 쓰고 싶습니다.

내 첫 번째 생각은 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();

내 방식이 좋은 걸까? 그렇다면 이 함수에서 syslog에 어떻게 기록합니까?

rsyslog를 사용하여 CentOS 7에서 postgresql 9.2를 사용하고 있습니다.

답변1

로깅을 올바르게 구성한 경우(옵션 참조)18.8.2. When To Log. PostgreSQL: 문서: 9.1: 오류 보고 및 로깅 postgresql.org |) 그리고 로그 대상이 syslog이면 이를 사용하여 RAISE무언가를 기록할 수 있습니다. 자세한 내용은 여기에서 확인할 수 있습니다.PostgreSQL: 문서: 8.3: 오류 및 메시지 postgresql.org |

답변2

내가 아는 한, 트리거에서 syslog 메시지를 생성하는 직접적인 방법은 없지만 이 작업을 수행하기 위해 외부 프로그램을 사용하는 것을 고려할 수 있습니다. 그러나 다음을 참조하십시오:PostgreSQL 트리거에서 외부 프로그램 호출트리거 내부의 외부 프로그램을 고려하는 경우. 데이터베이스 내의 감사 테이블에 메시지를 삽입하고 추가 작업("사용자 추가 또는 제거"와 같은 이벤트를 확인하기 위해 폴링 :-( 폴링)을 생성하는 경우 옵션이 있습니다.

관련 정보