Usar a extensão log_fdw para acessar o log de banco de dados usando SQL
O RDS for PostgreSQL é compatível com a extensão , que permite acessar o log do mecanismo de banco de dados usando uma interface SQL. A extensão log_fdw apresenta duas novas funções que facilitam a criação de tabelas externas para logs de banco de dados:
-
list_postgres_log_files– lista os arquivos no diretório do log do banco de dados e o tamanho do arquivo em bytes. -
create_foreign_table_for_log_file(table_name text, server_name text, log_file_name text)– cria uma tabela externa para o arquivo especificado no banco de dados atual.
Todas as funções criadas por log_fdw são de propriedade do rds_superuser. Os membros da função rds_superuser podem conceder acesso a essas funções para outros usuários do banco de dados.
Por padrão, os arquivos de log são gerados pelo Amazon RDS no formato (erro padrão) stderr, conforme especificado no parâmetro log_destination. Existem apenas duas opções para esse parâmetro, stderr e csvlog (valores separados por vírgula, CSV). Se você adicionar a opção csvlog ao parâmetro, o Amazon RDS gerará os dois logs, stderr e csvlog. Isso pode afetar a capacidade de armazenamento em seu cluster de banco de dados. Portanto, você precisa estar ciente dos outros parâmetros que afetam o processamento de logs. Para ter mais informações, consulte Definir o destino dos logs (stderr, csvlog).
Um benefício de gerar logs do csvlog é que a extensão log_fdw permite criar tabelas externas com dados divididos ordenadamente em várias colunas. Para fazer isso, sua instância precisa estar associada a um grupo de parâmetros de banco de dados personalizado para que você possa alterar a configuração para log_destination. Para obter mais informações sobre como fazer isso, consulte Trabalhar com parâmetros na instância de banco de dados do RDS para PostgreSQL.
O exemplo a seguir pressupõe que o parâmetro log_destination inclua cvslog.
Para usar a extensão log_fdw
-
Instale a extensão
log_fdw.postgres=>CREATE EXTENSION log_fdw;CREATE EXTENSION -
Crie o servidor de log como um wrapper externo de dados.
postgres=>CREATE SERVER log_server FOREIGN DATA WRAPPER log_fdw;CREATE SERVER -
Selecione todos os arquivos de log na lista.
postgres=>SELECT * FROM list_postgres_log_files() ORDER BY 1;A seguir você encontra um exemplo de resposta.
file_name | file_size_bytes ------------------------------+----------------- postgresql.log.2023-08-09-22.csv | 1111 postgresql.log.2023-08-09-23.csv | 1172 postgresql.log.2023-08-10-00.csv | 1744 postgresql.log.2023-08-10-01.csv | 1102 (4 rows) -
Crie uma tabela com uma única coluna "log_entry" para o arquivo selecionado.
postgres=>SELECT create_foreign_table_for_log_file('my_postgres_error_log', 'log_server', 'postgresql.log.2023-08-09-22.csv');A resposta não fornece nenhum detalhe além de que a tabela agora existe.
----------------------------------- (1 row) -
Selecione um exemplo de arquivo de log. O código a seguir recupera o horário do log e a descrição da mensagem de erro.
postgres=>SELECT log_time, message FROM my_postgres_error_log ORDER BY 1;A seguir você encontra um exemplo de resposta.
log_time | message ----------------------------------+--------------------------------------------------------------------------- Tue Aug 09 15:45:18.172 2023 PDT | ending log output to stderr Tue Aug 09 15:45:18.175 2023 PDT | database system was interrupted; last known up at 2023-08-09 22:43:34 UTC Tue Aug 09 15:45:18.223 2023 PDT | checkpoint record is at 0/90002E0 Tue Aug 09 15:45:18.223 2023 PDT | redo record is at 0/90002A8; shutdown FALSE Tue Aug 09 15:45:18.223 2023 PDT | next transaction ID: 0/1879; next OID: 24578 Tue Aug 09 15:45:18.223 2023 PDT | next MultiXactId: 1; next MultiXactOffset: 0 Tue Aug 09 15:45:18.223 2023 PDT | oldest unfrozen transaction ID: 1822, in database 1 (7 rows)