Cara membuat log layanan yang dikelola oleh systemd dengan benar melalui `file:` config

Aug 19 2020

Saya memiliki layanan yang dikelola oleh systemd yang memiliki konfigurasi systemd berikut yang memberi tahu systemd untuk menulis log ke file secara langsung (tidak ada syslog atau apa pun)

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

Saya memiliki aturan logrotate

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

Apa yang terjadi adalah log sedang diputar tetapi layanan masih menulis ke file lama yang dirotasi dan file log baru tetap kosong.

Saya memiliki pengaturan kerja serupa di mana layanan tersebut malah menulis ke syslog. Yang itu berfungsi dengan baik karena konfigurasi logrotate memiliki

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

, yang memberi tahu syslog bahwa lognya telah dirotasi.

Masalahnya adalah bahwa dalam kasus bermasalah saya, log akan langsung ke file jadi saya tidak tahu apakah (atau yang mana) saya perlu mengirim sinyal serupa ke systemd atau ke proses layanan yang sebenarnya.

Saya menemukan copytruncateopsi di logrotate yang saya cukup yakin akan memperbaiki masalah saya tetapi saya merasa bahwa ini bukan cara yang ideal untuk melakukannya, jika tidak copytruncateakan menjadi perilaku default logrotate.

Bagaimana cara mengatasi masalah ini? apakah saya perlu mengirim sinyal ke systemd? apakah saya perlu mengirim sinyal ke proses layanan? apakah saya harus menggunakan copytruncatelogrotate?
Jika penting, layanan ini adalah proses java yang menggunakan logback untuk menulis ke stdout

Jawaban

eleventyone Aug 18 2020 at 22:32

copytruncateadalah jawaban yang benar dalam kasus ini. Ini bukan default karena kurang umum untuk membutuhkannya, karena Anda akan memiliki daemon yang tepat yang dapat Anda beri sinyal untuk membuka kembali file log.

Alternatifnya adalah memulai ulang layanan dalam skrip pasca-rotasi, tetapi itu mungkin tidak nyaman atau tidak diinginkan.