Mongodb - maneira correta de girar logs

13

Os documentos do Mongo dizem que eu posso:

  1. use o sinal -SIGUSR1 e renomeie o registro antigo e troque a corrente
  2. use logrotate do SO

Eu quero a capacidade de rotação do sistema operacional para compactar arquivos antigos e remover os mais antigos, mas não vejo como o mongod mudar o registro atual, a não ser o envio do 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 arquivos de log bem nomeados de logrotate e arquivos de log vazios, mongodb.log.2013-09-18T23-49-44como vestígios da comutação SIGUSR1. Como se livrar do último?

Andrey Regentov
fonte

Respostas:

11

copytruncate funciona muito bem para rotação de log.

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
}
steveberryman
fonte
1
Isso não funcionou para mim no RedHat 6.5. Os logs foram girados, mas o arquivo .log original continuou a crescer sem limites.
Thomas Bratt
@ThomasBratt está correto, porque, sem reiniciar os processos do mongo, o manipulador de arquivos permanece aberto. fwics esse método não funcionará tão bem.
Mxx #
@ThomasBratt dê uma olhada nesta resposta stackoverflow.com/a/8396266/949859
Mxx 16/4
1
@Mxx Nice encontrar - parece que copytruncate irá trabalhar com o passo a postrotate de sinal para Mongo para truncar o arquivo de log
Thomas Bratt
15

O servidor travou para mim se você enviar SIGUSR1 para o mongod depois de mover o arquivo de log para fora do caminho com logrotate.

A seguinte configuração é segura para a versão que eu 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: https://jira.mongodb.org/browse/SERVER-11087 para obter mais detalhes e uma sugestão de Akshay Kumar, que usei acima (use create em vez de nocreate e cp / dev / null no arquivo de log).

Nas versões posteriores, é suposto haver uma opção logRotate que você pode usar para reabrir o arquivo - não renomeá-lo -, que contornará o problema de renomeação - mas não funcionou na minha versão (não era suportada).

Consulte: https://github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c

Eu testei isso com

logrotate -v -f /etc/logrotate.d/mongod
Bill Ryder
fonte
Funciona muito bem para mim no Mongo 2.6.11 no CentOS 7
Tim
Eu tive que substituir mongodb.log com mongod.log e ele funciona #
cwhisperer 15/10
Pode confirmar que, se systemLog.logRotate: reopenem mongod.conf, em seguida, o pkill irá funcionar como pretendido e não a exclusão do arquivo de log renomeado é necessária já que nenhum é criado.
Julian H. Lam
15

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

systemLog:
  logAppend: true
  logRotate: reopen

Veja também os 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
}
mmx73
fonte
Um arquivo PID criado a partir do arquivo de configuração deve provavelmente ser usado .... Veja processManagement.pidFilePathna configuração ou configuração pidfile do arquivo unidade Systemd ( /var/run/mongodb/mongod.pidpara mim)
van den Berg Gert
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 funcional era excluir os arquivos de log vazios que o Mongo produz
  • A localização do arquivo de bloqueio depende de como o MongoDB foi instalado
  • killé um Bash embutido, mas o logrotate é executado sob /bin/sh- o que não é reconhecido SIGUSR1no RedHat 6.5
  • Eu não testei com, compressmas deve ser uma adição direta
Thomas Bratt
fonte
-1

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

https://docs.mongodb.com/manual/tutorial/rotate-log-files/

Eric Aldinger
fonte
1
Parece que Andrey já leu essa documentação; você realmente não está respondendo à pergunta dele.
Law29