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.