Avviare non riaprendo i file di registro al logrotation


10

Usiamo upstart per gestire i nostri servizi sui nostri server Ubuntu. Producono registri che sono disconnessi in /var/log/upstart/SERVICE_NAME.log

Quindi quotidianamente, i file di registro vengono ruotati utilizzando lo script logrotation fornito con 12.04 LTS:

/var/log/upstart/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

Il problema è che mentre logrotate sposta i file, non sembra segnalare l'avvio di chiudere e riaprire i file, lasciando il processo di avvio scrivendo su un PID di eliminazione.

init          1       root    8w      REG              202,1        64       2431 /var/log/upstart/dbus.log.1 (deleted)
init          1       root   13w      REG              202,1        95       2507 /var/log/upstart/acpid.log.1 (deleted)
init          1       root   14w      REG              202,1       127      17377 /var/log/upstart/whoopsie.log.1 (deleted)
init          1       root   36w      REG              202,1       122       6747 /var/log/upstart/SERVICE_NAME.log.1 (deleted)
init          1       root   37w      REG              202,1        30       6762 

Ovviamente potrei reindirizzare l'output dai miei servizi ad altri file di registro, ma il problema sarebbe ancora presente per i processi di sistema. Inoltre, preferirei non dover costruire più infrastrutture di quelle di cui ho bisogno.


Ho anche incontrato questo. È molto strano che non l'abbiamo notato prima, il che mi fa pensare che potrebbe essere una cosa recente.
Pwaller,

1
Qualche aggiornamento a questo proposito? Vedendo lo stesso identico problema il 14.04. È a causa della nocreatedirettiva, non sono sicuro del motivo per cui qualcuno dovrebbe utilizzare questa direttiva, soprattutto per i servizi che potrebbero potenzialmente scrivere un sacco di output
rynop

Anche sperimentando questo.
Ztyx,

1
Ho trovato questo errore
Lety,

Risposte:


2

Credo che tu abbia 3 opzioni.

  1. Si modifica la configurazione esistente aggiungendo "copytruncate"

    /var/log/upstart/*.log { copytruncate daily missingok rotate 7 compress notifempty nocreate }

  2. Se non riesci o (non ti è permesso) modificare la configurazione del logrotate esistente a causa di altri file di log che non ne risentono e la configurazione esistente funziona per loro, sposta i tuoi file "SERVICE_NAME.log" in una nuova cartella in / var / log se lo desideri, crea una nuova configurazione con "copytruncate" e aggiungila a cron.daily.

  3. a) Se non ti è permesso modificare la configurazione del log dell'host host o aggiungerla al cron.daily del sistema operativo host, la tua terza opzione è quella di modificare gli script o i programmi per verificare che il file esista prima di scrivere sul file. b) Un altro modo è un po 'del punto 2 sopra che è quello di spostare i file di log da qualche altra parte e all'interno del tuo script o programma, eseguire il comando logrotate specifico per il file di log di quel programma.

Il punto 3b sopra è più complicato ma più elegante ed è quello che uso la maggior parte delle volte in quanto significa che il programma è autosufficiente e autogestito e non ha bisogno dei lavori del sistema operativo per fare da babysitter.

Per scoprire come eseguire logrotate manualmente e aggiungerlo al tuo programma o script, digita:

man logrotate

o

logrotate --help

Se si utilizza Python per i propri programmi, è possibile verificare come questo programma lo utilizza per autogestire i propri file di registro. http://bazaar.launchpad.net/~ferncasado/keep.awake/trunk/files/head:/v4/


0

Si scopre che si tratta di un problema noto e il ticket rimane aperto durante la digitazione.

La cosa giusta da fare è, probabilmente, semplicemente rimuovere il /etc/logrotate.d/upstarttutto e ruotare i file dei singoli servizi individualmente. Poiché la directory ( /var/log/upstart/) contiene solo lo stdout / stderr dei vari servizi - e nessun servizio destinato a essere eseguito come demone dovrebbe essere inviato a questi due canali. Tranne forse all'inizio.

Sui sistemi sto riuscendo, tre servizi sono gestiti da parvenu: php5.6-fpm, php7.1-fpm, e acpid. Nessuno dei tre registri è attivo, ma a volte il fpm viene riavviato a causa della /var/log/php5.6-fpm.logrotazione del suo file di registro principale ( ) - e provoca questo rumore, perché genera un po 'di insensatezza all'avvio.

Se insisti sulla rotazione di questi file, puoi fare affidamento sul fatto che i loro nomi corrispondono ai nomi dei servizi e utilizzare il seguente postrotatescript:

    postrotate
            service=${1##*/}
            service=${service%.log*}
            service $service restart > /dev/null
    endscript

Affinché quanto sopra funzioni, assicurati di non usare il sharedscriptsverbo lì dentro - il mio scriptlet si basa sul fatto, il percorso effettivo del file gli verrà passato come primo argomento ( $1).

(Il reindirizzamento in /dev/nullè utile, perché service-command è rumoroso - e non vuoi che tale rumore ti sia inviato via e-mail da cron. Nota, non sto reindirizzando stderrlì, solo stdout- se c'è un problema, tu riceverò comunque la tua e-mail al riguardo.)

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.