Mulai baru tidak membuka kembali file log pada logrotation

10

Kami menggunakan pemula untuk mengelola layanan kami di server Ubuntu kami. Mereka menghasilkan log yang logout ke /var/log/upstart/SERVICE_NAME.log

Kemudian setiap hari, file log diputar menggunakan skrip logrotation yang dilengkapi dengan 12,04 LTS:

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

Masalahnya adalah bahwa sementara logrotate memindahkan file, tampaknya tidak memberi sinyal untuk memulai baru untuk menutup dan membuka kembali file, membiarkan proses pemula menulis ke PID hapus.

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 

Jelas saya bisa mengarahkan output dari layanan saya sendiri ke file log lainnya, tetapi masalahnya masih ada di sana untuk proses sistem. Juga saya lebih suka tidak perlu membangun lebih banyak infrastruktur daripada yang saya butuhkan.

Andrew Newdigate
sumber
Saya juga baru saja mengalami ini. Sangat aneh kami tidak menyadarinya sebelumnya, yang membuat saya berpikir itu mungkin hal baru.
pwaller
1
Adakah pembaruan tentang ini? Melihat masalah yang sama persis pada 14,04. Its karena nocreatedirektif, tidak yakin mengapa ada orang yang menggunakan direktif ini, terutama untuk layanan yang berpotensi bisa menulis banyak output
rynop
Juga mengalami ini.
Ztyx
1
Saya menemukan bug ini
Lety

Jawaban:

2

Saya yakin Anda memiliki 3 opsi.

  1. Anda mengubah konfigurasi yang ada dengan menambahkan "copytruncate"

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

  2. Jika Anda tidak dapat atau (tidak diizinkan) untuk mengubah konfigurasi logrotate yang ada karena file log lain yang tidak menderita dan konfigurasi yang ada berfungsi untuk mereka, kemudian pindahkan file "SERVICE_NAME.log" Anda ke folder baru di bawah / var / log jika Anda inginkan, buat konfigurasi baru dengan "copytruncate" dan tambahkan ke cron.daily.

  3. a) Jika Anda tidak diizinkan untuk mengubah konfigurasi os host logrotate atau menambah cron.daily OS host, maka opsi ketiga Anda adalah mengubah skrip atau program untuk memeriksa apakah file tersebut ada sebelum menulis ke file. b) Cara lain adalah sedikit poin 2 di atas yang memindahkan file log Anda ke tempat lain dan di dalam skrip atau program Anda, jalankan perintah logrotate khusus untuk file log program itu.

Butir 3b di atas lebih rumit tetapi lebih elegan dan itulah yang paling sering saya gunakan karena artinya program ini swasembada dan dikelola sendiri dan tidak memerlukan pekerjaan OS untuk mengasuhnya.

Untuk mengetahui cara menjalankan logrotate secara manual dan menambahkannya ke program atau skrip Anda cukup ketik:

man logrotate

atau

logrotate --help

Jika Anda menggunakan Python untuk program Anda, Anda dapat memeriksa bagaimana program ini menggunakannya untuk mengelola sendiri file log-nya. http://bazaar.launchpad.net/~ferncasado/keep.awake/trunk/files/head:/v4/

DanglingPointer
sumber
0

Ternyata, ini adalah masalah yang diketahui dan tiket tetap terbuka saat saya mengetik ini.

Hal yang benar untuk dilakukan adalah, mungkin, hanya menghapus /etc/logrotate.d/upstartsemuanya dan memutar file dari masing-masing layanan secara individual. Karena direktori ( /var/log/upstart/) hanya berisi stdout / stderr dari berbagai layanan - dan tidak ada layanan yang dimaksudkan untuk berjalan sebagai daemon yang seharusnya menghasilkan ke dua saluran itu sama sekali. Kecuali, mungkin, pada saat startup.

Pada sistem saya mengelola, tiga layanan dijalankan oleh pemula: php5.6-fpm, php7.1-fpm, dan acpid. Tidak satu pun dari tiga log yang aktif tetapi kadang-kadang fpm di-restart karena file-log utamanya ( /var/log/php5.6-fpm.log) sedang diputar - dan hal ini menyebabkan kebisingan ini, karena menghasilkan beberapa kegilaan saat startup.

Jika Anda tetap bersikeras memutar file-file ini, Anda dapat mengandalkan fakta, bahwa nama mereka cocok dengan nama-nama layanan dan menggunakan postrotateskrip berikut :

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

Agar hal di atas berfungsi, pastikan untuk tidak menggunakan sharedscriptskata kerja di sana - skrip saya bergantung pada fakta, jalur sebenarnya ke file tersebut akan diteruskan sebagai argumen pertama ( $1).

(Pengalihan ke /dev/nullberguna, karena- serviceperintah berisik - dan Anda tidak ingin suara seperti itu dikirimkan kepada Anda melalui cron. Perhatikan, bahwa saya tidak mengarahkan ulang di stderrsana, hanya stdout- jika ada masalah, Anda Masih akan menerima email tentang hal itu.)

Mikhail T.
sumber