Ruota i registri di un'applicazione stupida non interattiva


8

Server Ubuntu 10.4.

Ho un muto servizio legacy non interattivo che è costantemente in esecuzione sul mio server.

Sta scrivendo il suo registro in un file con nome fisso (/var/log/something.log).

Non gestisce alcun segnale per rilasciare il file di registro. Devo ruotare quel file di registro.

C'è un modo per farlo correttamente senza cambiare l'applicazione e senza perdere alcun dato nel registro?

Risposte:


5

La risposta di Ignacio mi ha incuriosito, così ho fatto qualche ricerca e ho trovato la sceneggiatura del Perl di seguito. Se il tuo servizio scriverà su una pipe con nome, dovrebbe funzionare ed essere utilizzabile con logrotate.

Affinché funzioni, è necessario trasformare il file di registro in una pipe denominata. Rinomina quindi il file esistente

mkfifo /var/log/something.log

e per modificare i 3 nomi di file per soddisfare le tue esigenze. Esegui il tuo servizio quindi questo demone che dovrebbe leggere la named pipe e scriverlo in un nuovo file di log.

Se rinominate, /var/log/somethingrotateable.loginviate un HUP al demone che si genererà e creerà un nuovo somethingrotateable.logsu cui scrivere. Se si utilizza logrotate uno postrotatescript dikill -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;
   }
}

8

Accedere a un FIFO, quindi eseguire un demone che si collega all'altro lato di FIFO e dispone di gestori di segnale che consentono di ruotare il registro.


2

Invia SIGSTOP al processo, copia il registro con un altro nome, tronca il registro, invia SIGCONT al processo, forse in questo modo:

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

Potresti anche fare in modo che logrotate faccia la magia per te con script pre e post rotazione accuratamente realizzati e l'opzione copytruncate, in questo modo:

/ var / log / qualcosa {
    quotidiano
    ruotare 5
    copytruncate
    prerotate
        # Questo presuppone che tu abbia un file pid, ovviamente.
        # Se non lo fai, questo potrebbe invece essere un pkill come sopra.
        kill -STOP `cat / var / run / legacyappname.pid`
    endscript
    postrotate
        kill -CONT `cat / var / run / legacyappname.pid`
    endscript
}

Opzione interessante, grazie. Cosa succederà con le connessioni socket all'app e da essa durante l'arresto? Sono preoccupato per le disconnessioni.
— Alexander Gladysh,

Inoltre, l'app è in esecuzione sotto runit. Cosa farà il suo monitor se il processo dell'app viene interrotto?
— Alexander Gladysh,

Il comportamento delle connessioni dipende dal timeout con cui sono impostate e dal tempo impiegato per eseguire la rotazione effettiva. Non immaginerei che potresti avere problemi lì a meno che i registri non siano enormi. Non ho esperienza con runit, quindi non posso dirti come reagirà il monitor all'arresto del processo.
— segna il

Sembra funzionare perfettamente con systemd, il servizio mostra ancora come in esecuzione ben prima che avvenga la rotazione del registro. E suppongo che se il particolare pid che stavo fermando, i processi secondari del pid continuerebbero a funzionare?
— Joseph Persie,

1

È possibile provare a consentire all'applicazione di accedere a una pipe denominata e disporre di un programma (ad esempio syslog-ng ) che supporti i meccanismi di rotazione del registro appropriati per leggere le voci del registro e registrarle in un file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.