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?

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
}

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

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
}

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.