CodeGym /Cursos /SQL SELF /Log de Execução de Queries

Log de Execução de Queries

SQL SELF
Nível 45 , Lição 3
Disponível

Como em qualquer sistema complexo, no PostgreSQL rolam situações em que algo dá ruim: as queries demoram demais, a carga no servidor sobe e a galera começa a ficar nervosa. O log é o jeito de ficar de olho no que tá rolando por dentro do banco, pra:

  1. Achar queries lentas — aquelas que travam o app.
  2. Otimizar a performance — analisando como as queries se comportam.
  3. Diagnosticar erros — tipo violação de constraints ou sintaxe errada.
  4. Garantir auditoria — rastrear quem fez o quê no servidor.

Parâmetros-chave de log

Os arquivos de config do PostgreSQL (postgresql.conf) têm vários parâmetros ligados ao log. Bora ver os mais importantes.

  1. log_statement — log de queries SQL

O parâmetro log_statement define quais queries SQL vão pro log. Ele pode ter estes valores:

  • none — desliga o log das queries.
  • ddl — loga só comandos de definição de dados (tipo CREATE, ALTER, DROP).
  • mod — loga todos os comandos que mudam dados (tipo INSERT, UPDATE, DELETE).
  • all — loga todas as queries SQL (incluindo SELECT simples).

Exemplo:

Pra ativar o log de todas as queries, no postgresql.conf coloca:

log_statement = 'all'

Se quiser logar só comandos que mudam dados:

log_statement = 'mod'

Depois de mudar a config, não esquece de reiniciar o servidor:

sudo systemctl restart postgresql
  1. log_duration — log do tempo de execução

O parâmetro log_duration faz registrar no log quanto tempo cada query levou pra rodar. Isso é massa pra descobrir quais queries tão gastando mais tempo.

Exemplo:

Pra ativar o log da duração das queries, coloca:

log_duration = on

Se quiser logar só as queries lentas, usa o parâmetro log_min_duration_statement (a gente já fala dele).

  1. log_min_duration_statement — log de queries lentas

Esse parâmetro faz logar só as queries que demoram mais que o tempo definido (em milissegundos). Muito útil pra achar os "gargalos" do banco.

Exemplo:

Pra logar queries que levam mais de 1 segundo:

log_min_duration_statement = 1000

Se quiser logar TODAS as queries, independente do tempo, só coloca 0:

log_min_duration_statement = 0

O valor -1 desliga o log por duração.

  1. log_line_prefix — estrutura da mensagem no log

O parâmetro log_line_prefix deixa você customizar o formato das mensagens no log. Isso é útil pra botar contexto em cada query logada (tipo nome do user, PID, data e hora).

Exemplo:

Pra registrar nome do user, banco, hora e processo, usa:

log_line_prefix = '%t [%p]: [%d]: [%u]: '

Aqui:

  • %t — hora da query.
  • %p — PID do processo.
  • %d — nome do banco.
  • %u — nome do user.

Lista de todas as opções: Documentação PostgreSQL.

  1. logging_collector — coletor de logs

O parâmetro logging_collector ativa o esquema de gravar logs em arquivos. Se ele estiver desligado, os logs vão só pro stdout, o que pode ser chato.

Pra ativar o coletor de logs:

logging_collector = on

Não esquece de definir o caminho do arquivo de log com log_directory e log_filename:

log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%Y-%m-%d.log'

Usando os parâmetros na prática

Bora ver como usar os parâmetros de log num cenário real.

Cenário 1: log de todas as queries

Se você tá começando com um banco novo e quer ver tudo que rola, configura assim:

log_statement = 'all'
log_line_prefix = '%t [%p]: [%d]: [%u]: '

Agora toda query que rodar no banco vai pro arquivo de log — ótimo pra debugar!

Cenário 2: caçando queries lentas

Se você percebeu que o servidor às vezes "engasga" e quer achar as queries problemáticas, configura assim:

log_min_duration_statement = 500  # Loga queries acima de 500 ms
log_line_prefix = '%t [%p]: [%d]: [%u]: [%r] '

Onde %r adiciona o IP do cliente. Depois disso, fica fácil achar as queries que tão pesando no servidor.

Cenário 3: modo de log mínimo

Se seu servidor tá rodando de boa, mas você quer só o básico pra auditoria:

log_statement = 'mod'
log_duration = off

Aqui só vão pro log as mudanças de dados (tipo INSERT, UPDATE).

Analisando os logs

Quando os logs começam a encher de info, é importante saber analisar! Você pode:

Abrir o arquivo de log num editor de texto:

cat /var/log/postgresql/postgresql.log

Usar ferramentas tipo grep pra achar queries lentas:

grep "duration: " /var/log/postgresql/postgresql.log

Usar utilitários pra análise avançada de logs, tipo pgBadger.

Dicas úteis

Log detalhado demais pode lotar o disco. Em produção, usa só os parâmetros que realmente precisa.

Limpa ou arquiva os arquivos de log antigos com frequência pra não lotar o disco.

O log funciona melhor com parâmetros que pegam só o necessário. Por exemplo, log_min_duration_statement ajuda a ser preciso e economizar recurso.

Fechou? Agora ficou fácil configurar o log no PostgreSQL e usar ele pra analisar queries e melhorar a performance. Como já disse um (ou vários) dev desconhecido, mas gente boa: "Logs são nossa chance de olhar pro passado das queries e consertar o futuro do banco".

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION