Ekstensi log_fdw memetakan file log CSV PostgreSQL ke tabel eksternal, sehingga Anda dapat mengkueri log database menggunakan SQL standar—tanpa perlu akses shell. Fitur ini berguna untuk menganalisis kueri lambat, mengaudit aktivitas dalam rentang waktu tertentu, atau menyaring log berdasarkan tingkat keparahan, pengguna, atau sesi.
Prasyarat
Sebelum memulai, pastikan bahwa:
Instans RDS Anda menjalankan PostgreSQL 11.
Jika ekstensi tidak dapat dibuat, perbarui versi mesin minor instans Anda.
Cara kerja
log_fdw menyediakan dua fungsi:
| Fungsi | Deskripsi |
|---|---|
list_postgres_log_files() | Menampilkan daftar semua file log .csv yang tersedia beserta ukurannya. |
create_foreign_table_for_log_file(IN table_name text, IN log_server text, IN log_file text) | Membuat tabel eksternal yang dipetakan ke file log .csv tertentu. |
Setelah tabel eksternal dibuat, Anda dapat mengkuerinya seperti tabel biasa untuk mengambil data log.
Kueri Log dengan log_fdw
Langkah 1: Buat ekstensi
postgres=> create extension log_fdw;
CREATE EXTENSIONLangkah 2: Definisikan server log
postgres=> create server log_server foreign data wrapper log_fdw;
CREATE SERVERGanti log_server dengan nama yang ingin Anda berikan untuk server log.
Langkah 3: Tampilkan daftar file log yang tersedia
postgres=> select * from list_postgres_log_files() order by 1;
file_name | file_size_bytes
----------------------------------+-----------------
postgresql-2020-01-10_095546.csv | 3794
postgresql-2020-01-10_100336.csv | 318318
postgresql-2020-01-11_000000.csv | 198437
postgresql-2020-01-11_083546.csv | 4775
postgresql-2020-01-13_030618.csv | 3347Langkah 4: Buat tabel eksternal untuk file log
postgres=> select create_foreign_table_for_log_file('ft1', 'log_server', 'postgresql-2020-01-13_030618.csv');
create_foreign_table_for_log_file
-----------------------------------
t
(1 row)Tiga parameter tersebut adalah nama tabel eksternal, nama server log, dan nama file log.
Langkah 5: Kueri tabel eksternal
postgres=> select log_time, message from ft1 order by log_time desc limit 2;
log_time | message
----------------------------+-------------------------------------------------------------------
2020-01-13 03:35:00.003+00 | cron job 1 completed: INSERT 0 1 1
2020-01-13 03:35:00+00 | cron job 1 starting: INSERT INTO cron_test VALUES ('Hello World')
(2 rows)Skema tabel eksternal
Tabel eksternal yang dibuat oleh create_foreign_table_for_log_file() memiliki kolom-kolom berikut:
postgres=> \d+ ft1
Foreign table "public.ft1"
Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description
------------------------+-----------------------------+-----------+----------+---------+-------------+----------+--------------+-------------
log_time | timestamp(3) with time zone | | | | | plain | |
user_name | text | | | | | extended | |
database_name | text | | | | | extended | |
process_id | integer | | | | | plain | |
connection_from | text | | | | | extended | |
session_id | text | | | | | extended | |
session_line_num | bigint | | | | | plain | |
command_tag | text | | | | | extended | |
session_start_time | timestamp with time zone | | | | | plain | |
virtual_transaction_id | text | | | | | extended | |
transaction_id | bigint | | | | | plain | |
error_severity | text | | | | | extended | |
sql_state_code | text | | | | | extended | |
message | text | | | | | extended | |
detail | text | | | | | extended | |
hint | text | | | | | extended | |
internal_query | text | | | | | extended | |
internal_query_pos | integer | | | | | plain | |
context | text | | | | | extended | |
query | text | | | | | extended | |
query_pos | integer | | | | | plain | |
location | text | | | | | extended | |
application_name | text | | | | | extended | |
Server: log_server
FDW options: (filename 'postgresql-2020-01-13_030618.csv')Kolom utama untuk analisis log:
| Kolom | Tipe | Deskripsi |
|---|---|---|
log_time | timestamp(3) with time zone | Timestamp entri log |
user_name | text | Pengguna database yang memicu event |
database_name | text | Database tempat event terjadi |
process_id | integer | ID proses OS dari backend PostgreSQL |
error_severity | text | Tingkat log: DEBUG, INFO, NOTICE, WARNING, ERROR, LOG, FATAL, atau PANIC |
sql_state_code | text | Kode kesalahan SQLSTATE lima karakter (mengikuti standar SQL) |
message | text | Pesan log utama |
detail | text | Pesan detail tambahan, jika ada |
hint | text | Saran tindakan untuk menyelesaikan kesalahan, jika disediakan |
internal_query | text | Kueri internal yang memicu kesalahan, jika berlaku |
internal_query_pos | integer | Offset karakter dalam internal_query tempat kesalahan terjadi |
context | text | Konteks stack pemanggilan saat entri log dibuat |
query | text | String kueri yang dikirim pengguna, jika berlaku |
query_pos | integer | Offset karakter dalam query tempat kesalahan terjadi |
command_tag | text | Jenis perintah SQL yang terkait dengan entri log (misalnya, SELECT, INSERT) |
session_id | text | Pengidentifikasi unik untuk session database |
session_start_time | timestamp with time zone | Waktu session database dimulai |
session_line_num | bigint | Nomor baris dalam output log session |
virtual_transaction_id | text | ID transaksi virtual yang diberikan sebelum ID transaksi nyata dialokasikan |
transaction_id | bigint | ID transaksi nyata, setelah dialokasikan |
connection_from | text | Alamat host dan port klien |
location | text | Lokasi file sumber dalam kode server PostgreSQL tempat entri log dihasilkan |
application_name | text | Nama aplikasi klien, jika diatur |