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