Configurando o log do PostgreSQL

Como a grande maioria dos softwares e ferramentas Open Source sempre que efetuamos sua instalação precisamos configurar o seu log, com o PostgreSQL isso também não é diferente. Porém ao procurá-lo no nosso já familiarizado /var/log o mesmo não se encontrava, para gerar o log do PostgreSQL é necessário alterar seu arquivo de configuração /var/lib/pgsql/data/postgresql.conf.

O PostgreSQL suporta diversos métodos para armazenar as mensagens de log:

stderr;
csvlog;
syslog.

O mais utilizado é o stderr que produz uma saída mais fácil de ser visualizada. O csvlog é uma boa opção para exportá-lo para uma outra ferramenta de análise, e o syslog é o padrão dos logs de sistema.

O arquivo de configuração do PostgreSQL possui uma infinidade de paramêtros para ajustes, mas para este artigo vamos nos ater a uma configuração simples, básica e funcional.

Primeiro vamos alterar os parâmetros onde queremos registrar esses logs:

# - Where to log -
log_destination='stderr'
logging_collector=on
log_directory='/var/log/postgresql'
log_filename='postgresql-%a.log'
log_file_mode=0600
log_truncate_on_rotation=on
log_rotation_age=1d
log_rotation_size=100MB

Aqui estamos dizendo para o PostgreSQL em que situação (quando) um log deve ser gerado.

# - When to log -
client_min_messages = notice
log_min_messages = warning
log_min_error_statement = error
log_min_duration_statement = 60000

Os parâmetros existentes são os seguintes:

DEBUG5;
DEBUG4;
DEBUG3;
DEBUG2;
DEBUG1;
LOG;
NOTICE;
WARNING;
ERROR;
FATAL;
PANIC.

DEBUG5 é a opção que gera mais log e PANIC é a que gera menos log.

client_min_messages – Diz quais mensagens serão enviadas para o usuário enquanto ele interage com o banco de dados. Um exemplo disso é quando você utiliza o psql.

log_min_messages – é o parâmetro que mede o que vai ser gravado de fato no nosso log.

log_min_error_statementconfigura especificamente quando um comando SQL com erro vai ser gravado no log.

log_min_duration_statement – é uma diretiva de log muito importante para analisar o desempenho do banco, como por exemplo quanto tempo uma determinada query está levando para ser executada. Saber quais consultas podem demorar mais que o esperado pode ser muito útil para interceptar gargalos na performance do banco.

Agora vamos definir o que queremos que seja registrado:

# - What to log -
log_checkpoints = off
log_duration = off
log_error_verbosity = default
log_hostname = off
log_line_prefix = '%t [%p]: [%l] user=%u,db=%d,app=%a,host=%h'
log_lock_waits = on
log_statement = 'ddl'
log_temp_files = 0
log_hostname = on

Feito isso restartamos nosso banco:

[root@notebook ~]# systemctl restart postgresql.service

E já podemos observar a saída no nosso arquivo de log funcionando corretamente:

[root@notebook ~]# cat /var/log/postgresql/postgresql-Fri.log
2015-11-06 22:21:50 -03 [16552]: [1] user=,db=,app=,host=LOG: sistema de banco de dados foi desligado em 2015-11-06 22:21:49 -03
2015-11-06 22:21:50 -03 [16556]: [1] user=,db=,app=,host=LOG: inicializador do autovacuum foi iniciado
2015-11-06 22:21:50 -03 [16550]: [1] user=,db=,app=,host=LOG: sistema de banco de dados está pronto para aceitar conexões

Dropamos o banco teste para analisarmos o log:

2015-11-06 22:32:41 -03 [17185]: [1] user=postgres,db=postgres,app=psql,host=[local]LOG: comando: drop database teste1;
2015-11-06 22:32:42 -03 [17185]: [2] user=postgres,db=postgres,app=psql,host=[local]LOG: duração: 364.792 ms

Referência:
https://www.postgresql.org/docs/current/static/runtime-config-logging.html