Rsyslog deja de enviar datos al servidor remoto después de la rotación de registros

9

En mi configuración, tengo rsyslog que está a cargo de seguir los cambios de /home/user/my_app/shared/log/unicorn.stderr.loguso imfile. El contenido se envía a otro servidor de registro remoto mediante TCP.

Cuando el archivo de registro gira, rsyslog deja de enviar datos al servidor remoto.

Intenté volver a cargar rsyslog, enviar una señal HUP y reiniciarlo por completo, pero nada funcionó.

Las únicas formas en que pude encontrar que realmente funcionaban eran sucias:

  • detenga el servicio, elimine los archivos de estadísticas de rsyslog e inicie rsyslog nuevamente. Todo eso en un gancho postrotate en mi archivo logrotate.
  • kill -9 rsyslog y comenzar de nuevo.

¿Hay alguna manera adecuada de hacer esto sin tocar las partes internas de rsyslog?

Archivo Rsyslog

$ ModLoad immark
$ ModLoad imudp
$ ModLoad imtcp
$ ModLoad imuxsock
$ ModLoad imklog
$ ModLoad imfile

$ template WithoutTimeFormat, "[entorno] [% syslogtag%] -% msg%"

$ WorkDirectory / var / spool / rsyslog

$ InputFileName /home/user/my_app/shared/log/unicorn.stderr.log
$ InputFileTag unicorn-stderr
$ InputFileStateFile stat-unicorn-stderr
$ InputFileSeverity info
$ InputFileFacility local8
$ InputFilePollInterval 1
$ InputFilePersistStateInterval 1
$ InputRunFileMonitor

# Reenviar al servidor remoto
si $ syslogtag contiene 'apache-' entonces @@ my_server: 5000; SinTiempoFormato
: syslogtag, contiene, "apache-" ~

*. * @@ my_server: 5000; SyslFormat

Logrotate file

/home/user/my_app/shared/log/*.log {
  diario
  missingok
  dateext
  girar 30
  comprimir
  notifempty
  extensión gz
  copytruncate
  crear 640 usuario usuario
  guiones compartidos
  post-rotar
    (detener rsyslog && rm / var / spool / rsyslog / stat- * && iniciar rsyslog 2> & 1) || cierto
  escritura final
}

Para su información, el archivo es legible para el usuario rsyslog, mi servidor es accesible y otros archivos de registro que no rotan en el mismo ciclo continúan siendo rastreados correctamente.

Estoy ejecutando Ubuntu 12.04.

Vincent B.
fuente

Respuestas:

8

El problema en realidad provenía de logrotate.

Básicamente con mi configuración, ejecutando unicornio, no necesito usar la copytruncatedirectiva. (que es lo que causa problemas aquí)

USR1: vuelve a abrir todos los registros que pertenecen al proceso de trabajo. Ver Unicorn :: Util.reopen_logs para lo que se considera un registro. Los archivos de registro no se vuelven a abrir hasta que se haya procesado la solicitud actual, por lo que varias líneas de registro para una solicitud (como lo hizo Rails) no se dividirán en varios registros.

Esto comenzó a funcionar correctamente después de actualizar a esta configuración:

/home/user/my_app/shared/log/*.log {
  daily
  missingok
  dateext
  rotate 30
  compress
  notifempty
  extension gz
  create 640 user user
  sharedscripts

  post-rotate
    # Telling Unicorn to reload files
    test -s /home/user/my_app/shared/pids/unicorn.pid && kill -USR1 "$(cat /home/user/my_app/shared/pids/unicorn.pid)"

    # Reloading rsyslog telling it that files have been rotated
    reload rsyslog 2>&1 || true
  endscript
}
Vincent B.
fuente
Si se trata de copias directas de su archivo, creo que su problema fue en realidad el que estaba usando post-rotate(lo cual no es una cosa) en lugar de eso postrotate, porque ese script original de logrotate que tenía debería haber funcionado bien con rsyslog (si el script postrotate se hubiera estado ejecutando ) ...?
mltsy
2
No recuerdo cuándo, pero cambié post-rotatepor lastaction. Su comentario aún es muy sensato y puede haber resuelto mi problema en ese momento :). Sin embargo, para el registro, evitaré usarlo copytruncateen el futuro de todos modos porque es lento y juega con controladores de archivos.
Vincent B.
2

Su archivo logrotate contiene una entrada para /home/user/shared/log/*.log, que no coincide con su archivo de registro /home/user/my_app/shared/log/unicorn.stderr.log. copytruncateDebe agregar una entrada logrotate para ese directorio y asegurarse de que contenga ; tal como está, rsyslog está cambiando el nombre del archivo actual y creando uno nuevo, y el archivo sigue el manejo del archivo ahora renombrado.

Jenny D
fuente
Lo sentimos, el nombre de archivo es solo un error tipográfico. Sin embargo, copytruncate podría ser un buen punto. Déjame ver eso :).
Vincent B.