Mongodb: forma adecuada de rotar los registros

13

Los documentos de Mongo dicen que puedo:

  1. use la señal -SIGUSR1 y cambie el nombre del registro antiguo y cambie la corriente
  2. usar logrotate del sistema operativo

Quiero la capacidad de rotación del sistema operativo para comprimir archivos antiguos y eliminar los más antiguos, pero no veo la manera de decirle al proceso mongod que cambie el registro actual que no sea enviar SIGUSR1.

Entonces escribí

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

a /etc/logrotate.d/mongo.

Y ahora obtenga archivos de registro bien nombrados de logrotate y archivos de registro vacíos mongodb.log.2013-09-18T23-49-44como trazas de conmutación SIGUSR1. ¿Cómo deshacerse de este último?

Andrey Regentov
fuente

Respuestas:

11

copytruncate funciona bastante bien para la rotación de registros.

una configuración similar a esta debería hacer el trabajo por usted:

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}
steveberryman
fuente
1
Esto no funcionó para mí en RedHat 6.5. Los registros se rotaron pero el archivo .log original continuó creciendo sin límite.
Thomas Bratt
@ThomasBratt esto es correcto porque sin reiniciar los procesos de mongo el controlador de archivos permanece abierto. fwics este método no funcionará tan bien.
Mxx
@ThomasBratt eche un vistazo a esta respuesta stackoverflow.com/a/8396266/949859
Mxx
1
@Mxx Nice find: parece que copytruncate funcionará con el paso postrotate para indicarle a Mongo que trunca el archivo de registro
Thomas Bratt
15

El servidor se bloqueó para mí si envía SIGUSR1 a mongod después de haber quitado el archivo de registro con logrotate.

La siguiente configuración es segura para la versión que he probado: 2.6.6 en ubuntu 12.04; los ejemplos anteriores bloquearon el servidor. Ponga esto en /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
}

Consulte: https://jira.mongodb.org/browse/SERVER-11087 para obtener más detalles y una sugerencia de Akshay Kumar que utilicé en lo anterior (use create en lugar de nocreate y cp / dev / null para el archivo de registro).

En versiones posteriores se supone que debe haber una opción logRotate que puede usar para volver a abrir el archivo, no cambiarle el nombre, lo que solucionará el problema de cambio de nombre, pero no funcionó en mi versión (no era compatible).

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

He probado esto con

logrotate -v -f /etc/logrotate.d/mongod
Bill Ryder
fuente
Funciona muy bien para mí en Mongo 2.6.11 en CentOS 7
Tim
Tuve que reemplazar mongodb.log con mongod.log y funciona
cwhisperer el
Puede confirmar que si está systemLog.logRotate: reopendentro mongod.conf, entonces el pkill funcionará según lo previsto y no se requiere la eliminación del archivo de registro renombrado ya que no se crea ninguno.
Julian H. Lam
15

Desde mongodb 3.0 puede cambiar el comportamiento de mongodb con el parámetro logRotate, cambie en /etc/mongod.conf

systemLog:
  logAppend: true
  logRotate: reopen

Ver también Manuales de Mongo .

Entonces puede usar esta configuración 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
fuente
Probablemente debería usarse un archivo PID creado a partir del archivo de configuración ... Ver processManagement.pidFilePathen la configuración o la configuración PIDFile del archivo de la unidad SystemD ( /var/run/mongodb/mongod.pidpara mí)
Gert van den Berg
0

Lo siguiente funcionó para mí:

/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:

  • Probado en RedHat 6.5
  • La única forma en que pude obtener una solución de trabajo fue eliminar los archivos de registro vacíos que produce Mongo
  • La ubicación del archivo de bloqueo depende de cómo se instaló MongoDB
  • killes un Bash incorporado pero se ejecuta logrotate /bin/sh, que no reconoce SIGUSR1en RedHat 6.5
  • No he probado con, compresspero debería ser una adición sencilla
Thomas Bratt
fuente
-1

Tenga en cuenta que en la versión 3.0 y superior no es necesario eliminar el daemon de su base de datos simplemente para rotar un registro. Consulte la documentación aquí:

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

Eric Aldinger
fuente
1
Parece que Andrey ya leyó esa documentación; Realmente no estás respondiendo su pregunta.
Ley29