Mongodb - maneira correta de girar logs

11

Os docs do Mongo dizem que eu posso:

  1. use o sinal -SIGUSR1 e obtenha o registro antigo renomeado e comutado atual
  2. use logrotate do sistema operacional

Eu quero que a capacidade de logrotate do sistema operacional zipar arquivos antigos e remover os mais antigos, mas não vejo como dizer ao processo mongod para alternar o log atual, a não ser enviar SIGUSR1.

Então eu escrevi

/var/log/mongodb/*.log {
    daily
    rotate 5
    compress
    dateext
    missingok
    notifempty
    sharedscripts
    postrotate
        /usr/bin/killall -SIGUSR1 mongod
        /usr/bin/killall -SIGUSR1 mongos
    endscript
}

para /etc/logrotate.d/mongo.

E agora obtenha logfiles bem conhecidos do logrotate e logfiles vazios como mongodb.log.2013-09-18T23-49-44 como traços de comutação SIGUSR1. Como se livrar do último?

    
por Andrey Regentov 20.09.2013 / 12:12

5 respostas

9

copytruncate funciona muito bem para o logrotation.

uma configuração semelhante a esta deve fazer o trabalho para você:

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}
    
por 20.09.2013 / 12:22
14

O servidor travou por mim se você enviar SIGUSR1 para o mongod depois de ter removido o arquivo de log do logrotate.

A seguinte configuração é segura para a versão que testei - 2.6.6 no ubuntu 12.04 - os exemplos anteriores travaram o servidor. Coloque isso em /etc/logrotate.d/mongod:

/var/log/mongodb/mongodb.log {
    weekly
    missingok
    rotate 4
    compress
    notifempty
    create
    postrotate
        /usr/bin/pkill -USR1 mongod
        rm /var/log/mongodb/mongodb.log.????-??-??T??-??-??
    endscript
}

Veja: link para mais detalhes e uma sugestão de Akshay Kumar que usei acima (use create em vez de nocreate e cp / dev / null para o arquivo de log).

Em lançamentos posteriores, supõe-se ser uma opção logRotate que você pode usar para reabrir o arquivo - não renomeá-lo - que funcionará em torno do problema de renomeação - mas não funcionou na minha versão (não foi suportado). / p>

Veja: link

Eu testei isso com

logrotate -v -f /etc/logrotate.d/mongod
    
por 17.12.2014 / 04:35
13

Desde o mongodb 3.0 você pode mudar o comportamento do mongodb com o parâmetro logRotate, mudar em /etc/mongod.conf

systemLog:
  logAppend: true
  logRotate: reopen

Veja também Manuais do Mongo .

Então você pode usar esta configuração de logrotate:

/var/log/mongodb/*.log {
    daily
    rotate 30
    size 50M
    compress
    dateext
    missingok
    notifempty
    sharedscripts
    postrotate
        /bin/kill -SIGUSR1 'cat /var/lib/mongodb/mongod.lock 2> /dev/null' 2> /dev/null || true
    endscript
}
    
por 18.01.2016 / 11:15
0

O seguinte funcionou para mim:

/var/log/mongo/mongod.log {
    missingok
    rotate 3
    size 100M
    nodateext
    postrotate
            /usr/bin/kill -USR1 $(cat /var/run/mongod.pid)
            rm -f /var/log/mongo/mongod.log.[0-9][0-9][0-9][0-9]-*
    endscript
}

Notas:

  • Testado no RedHat 6.5
  • A única maneira de obter uma solução de trabalho era excluir os arquivos de log vazios que o Mongo produzia
  • A localização do arquivo de bloqueio depende de como o MongoDB foi instalado
  • kill é um Bash embutido, mas logrotate é executado sob /bin/sh - que não reconhece SIGUSR1 no RedHat 6.5
  • Eu não testei com compress , mas deve ser uma adição direta
por 16.10.2014 / 17:34
-1

Observe que, na versão 3.0 e superior, não é necessário eliminar o daemon do banco de dados simplesmente para rotacionar um log. Consulte a documentação aqui:

link

    
por 05.07.2016 / 20:13