Come registrare correttamente ruotare i log del servizio gestito da systemd tramite `file:` config

Aug 19 2020

Ho un servizio gestito da systemd che ha la seguente configurazione di systemd che dice a systemd di scrivere i log direttamente su un file (no syslog o altro)

StandardOutput=file:/var/log/foo/my.log

Ho una regola logrotate

/var/log/foo/*.log
{
        rotate 31
        daily
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
}

Quello che sta succedendo è che i log vengono ruotati ma il servizio sta ancora scrivendo sul vecchio file ruotato e il nuovo file di log rimane vuoto.

Ho una configurazione di lavoro simile in cui il servizio invece scrive su syslog. Quello funziona bene perché la configurazione di logrotate ha

postrotate
                invoke-rc.d rsyslog rotate > /dev/null

, che notifica a syslog che il suo registro è stato ruotato.

Il problema è che nel mio caso problematico il log va direttamente al file, quindi non so se (o quale) devo inviare un segnale simile a systemd o al processo di servizio effettivo.

Ho trovato l' copytruncateopzione in logrotate che sono abbastanza sicuro risolverà il mio problema, ma ho la sensazione che questo non sia il modo ideale per farlo, altrimenti copytruncatesarebbe il comportamento predefinito di logrotate.

Come risolvo questo problema? devo inviare un segnale a systemd? devo inviare un segnale al processo di servizio? devo usare copytruncateinvece in logrotate?
Se è importante, il servizio è un processo java che utilizza il logback per scrivere su stdout

Risposte

eleventyone Aug 18 2020 at 22:32

copytruncateè la risposta giusta in questo caso. Non è l'impostazione predefinita perché è meno comune averne bisogno, perché avresti un demone appropriato che puoi segnalare per riaprire il file di registro.

L'alternativa è riavviare il servizio nello script di post-rotazione, ma ciò potrebbe non essere conveniente o desiderabile.