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:
- Achar queries lentas — aquelas que travam o app.
- Otimizar a performance — analisando como as queries se comportam.
- Diagnosticar erros — tipo violação de constraints ou sintaxe errada.
- 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.
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 (tipoCREATE,ALTER,DROP).mod— loga todos os comandos que mudam dados (tipoINSERT,UPDATE,DELETE).all— loga todas as queries SQL (incluindoSELECTsimples).
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
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).
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.
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.
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".
GO TO FULL VERSION