Rotar loggings de una aplicación muda no interactiva

Ubuntu 10.4 Server.

Tengo un mudo service de legado no interactivo que se ejecuta constantemente en mi server.

Está escribiendo su logging en un file con nombre fijo (/var/log/something.log).

No maneja ninguna señal para dejar pasar el file de logging. Necesito girar ese file de logging.

¿Hay una manera de hacer esto correctamente sin cambiar la aplicación y sin perder ningún dato en el logging?

4 Solutions collect form web for “Rotar loggings de una aplicación muda no interactiva”

La respuesta de Ignacio me intrigó así que hice algunas investigaciones y surgió con el guión de Perl abajo. Si su service va a escribir a un tubo con nombre que debe funcionar y ser utilizable con logrotate.

Para que funcione usted necesita hacer su file de logging en un tubo con nombre. Cambiar el nombre del file existente

mkfifo /var/log/something.log 

y para editar los 3 nombres de files para satisfacer sus necesidades. Ejecute su service a continuación, este daemon que debe leer la canalización con nombre y escribirlo en un nuevo file de logging.

Si cambia el nombre de /var/log/somethingrotateable.log luego envía un HUP al daemon se generará y creará un nuevo somethingrotateable.log para escribir. Si utiliza logrotate una secuencia de commands postrotate de kill -HUP 'cat /var/run/yourpidfile.pid'

 #!/usr/bin/perl -w use POSIX (); use FindBin (); use File::Basename (); use File::Spec::Functions; # $|=1; # # Change the 3 filenames and paths below to meet your requirements. # my $FiFoFile = '/var/log/something.log'; my $LogFile = '/var/log/somethingrotateable.log'; my $PidFile = '/var/run/yourpidfile.pid'; # # make the daemon cross-platform, so exec always calls the script # # itself with the right path, no matter how the script was invoked. my $script = File::Basename::basename($0); my $SELF = catfile $FindBin::Bin, $script; # # # POSIX unmasks the sigprocmask properly my $sigset = POSIX::SigSet->new(); my $action = POSIX::SigAction->new('sigHUP_handler',$sigset,&POSIX::SA_NODEFER); POSIX::sigaction(&POSIX::SIGHUP, $action); sub sigHUP_handler { # print "Got SIGHUP"; exec($SELF, @ARGV) or die "Couldn't restart: $!\n"; } #open the logfile to write to open(LOGFILE, ">>$LogFile") or die "Can't open $LogFile"; open(PIDFILE, ">$PidFile") or die "Can't open PID File $PidFile"; print PIDFILE "$$\n"; close PIDFILE; readLog(); sub readLog { sysopen(FIFO, $FiFoFile,0) or die "Can't open $FiFoFile"; while ( my $LogLine = <FIFO>) { print LOGFILE $LogLine; } } 

Registrar en un FIFO, a continuación, ejecute un daemon que se conecta al otro lado de la FIFO y tiene manejadores de señal que le permiten girar el logging.

Enviar SIGSTOP al process, copyr el logging a otro nombre, truncar el logging, enviar SIGCONT al process, tal vez como este:

 pkill -STOP legacyappname
 cp /var/log/something.log /var/log/something.log.backup
 cat / dev / null> /var/log/something.log
 pkill -CONT legacyappname

También podría tener logrotate hacer la magia para usted con guiones de pre y post rotation cuidadosamente elaborados y la opción copytruncate, así:

 / var / log / something {
     diariamente
     rotar 5
     copytruncate
     prorrotate
         # Esto supone que usted tiene un file pid, por supuesto.
         # Si no lo hace, esto en su lugar podría ser un pkill como arriba.
         kill -STOP `cat / var / run / legacyappname.pid`
     final de la palabra
     postrotate
         kill -CONT `cat / var / run / legacyappname.pid`
     final de la palabra
 }

Puede intentar dejar que el logging de la aplicación en un canal con nombre y tener algún progtwig (por ejemplo, syslog-ng ) que admita los mecanismos de rotation de logging adecuado leer las inputs de logging y registrarlas en un file.

  • Qué process crea el file access_log.processed
  • FreeBSD 8.1 64bit logrotate - intérprete ELF /libexec/ld-elf-so.1 no encontrado
  • logrotate a / dev / null dos veces?
  • Hacer logrotate eliminar los registros antiguos después de reducir el valor de rotación
  • Logrotate: cómo acceder al file de salida en postrotate
  • Hacer logrotate eliminar los loggings antiguos después de networkingucir el valor de rotation
  • Utilice Logrotate para truncar los files de logging después de cada input o borrar las últimas inputs 'n'
  • Formato preferido de nombres de file que incluyen una timestamp
  • Retardo de compensación de logrotation de Linux
  • Cómo utilizar comodines dentro de los files de configuration de logrotate
  • ¿Cómo se comporta el logrotate cuando hay * y hay un nombre de file explícito en la rotation de loggings en una ruta?
  • parameters de compression logrotate
  • logrotate trabajo cron no girar ciertos loggings
  • El linux y los temas del servidor de Windows, como ubuntu, centos, apache, nginx, debian y consejos de red.