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?

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.