PythonでPostgreSQLのロギングと監査を設定する方法

この記事では、Pythonを用いたPostgreSQLのロギングと監査の設定について詳しく解説します。具体的なコード例、その詳細な解説、応用例を含めています。

目次

はじめに

PostgreSQLを運用する際に欠かせないのが、ロギングと監査です。これらを適切に設定することで、データベースの状況を把握し、問題が起きた際に迅速に対処することが可能です。Pythonを使えば、これらの設定も効率的に行うことができます。

基本的なロギング設定

設定ファイルの場所を確認する

import psycopg2

# PostgreSQLに接続
conn = psycopg2.connect("dbname=test user=postgres password=secret")

# カーソルオブジェクトを作成
cur = conn.cursor()

# 設定ファイルの場所を確認
cur.execute("SHOW config_file;")
config_file = cur.fetchone()[0]
print(f"Config file location: {config_file}")

# リソースを開放
cur.close()
conn.close()

このコードは、psycopg2ライブラリを使用してPostgreSQLに接続し、設定ファイルの場所を確認します。

ロギングレベルを設定する

Pythonでの設定変更は主にSQL文を発行する形で行います。以下はロギングレベルを設定するSQL文をPythonから発行する例です。

# 省略(接続処理)
cur.execute("ALTER SYSTEM SET logging_collector TO 'on';")
cur.execute("ALTER SYSTEM SET log_statement TO 'all';")
# 省略(リソースを開放)

監査設定

監査用のテーブルを作成する

# 省略(接続処理)
cur.execute("""
CREATE TABLE audit_log (
    id serial PRIMARY KEY,
    username VARCHAR(50),
    action_time TIMESTAMP,
    action VARCHAR(50),
    details TEXT
);
""")
# 省略(リソースを開放)

トリガーを用いた監査

トリガーを用いて、特定の操作が行われた際に監査用のテーブルに記録を残す方法です。

# 省略(接続処理)
cur.execute("""
CREATE OR REPLACE FUNCTION audit_action()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO audit_log (username, action_time, action, details) VALUES (CURRENT_USER, CURRENT_TIMESTAMP, TG_OP, 'Details here');
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;
""")
# 省畎(リソースを開放)

応用例

1. 定期的なロギング情報のアーカイブ

import shutil
import os

# ログファイルの場所
log_path = "/var/log/postgresql/"

# アーカイブ先
archive_path = "/var/log/postgresql/archive/"

# ログファイルをアーカイブする関数
def archive_logs():
    for filename in os.listdir(log_path):
        if filename.endswith(".log"):
            shutil.move(os.path.join(log_path, filename), os.path.join(archive_path, filename))

archive_logs()

2. 監査結果の定期的なメール送信

import smtplib
from email.message import EmailMessage

def send_audit_report():
    # 省略(データベースから監査結果を取得)

    msg = EmailMessage()
    msg.set_content('Audit report here')

    msg['Subject'] = 'Audit Report'
    msg['From'] = 'audit@example.com'
    msg['To'] = 'admin@example.com'

    # メール送信
    with smtplib.SMTP('localhost') as s:
        s.send_message(msg)

send_audit_report()

まとめ

Pythonを使ってPostgreSQLのロギングと監査を効率的に行う方法について解説しました。これを機に、Pythonを用いてより高度なデータベース管理を行ってみてはいかがでしょうか。

コメント

コメントする

目次