Logrotate tidak berfungsi

18

Saya mencoba membuat logrotate untuk bekerja pada VPS saya untuk memutar file apache saya setiap minggu. Saat ini isi dari file konfigurasi apache2 adalah seperti itu.

"/var/www/user/site.com/logs/*.log"   {
        weekly
        missingok
        rotate 8
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/apache2 reload > /dev/null
        endscript
}

Saya telah meninggalkannya selama dua minggu sekarang dan tidak ada yang berubah sejauh yang saya tahu. Ketika saya mensimulasikannya dari baris perintah saya mendapatkan output berikut.

user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/apache2
reading config file /etc/logrotate.d/apache2
reading config info for "/var/www/user/site.com/logs/*.log" 

Handling 1 logs

rotating pattern: "/var/www/user/site.com/logs/*.log"     weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
  log does not need rotating
considering log /var/www/user/site.com/logs/error.log
  log does not need rotating
not running postrotate script, since no logs were rotated

Adakah gagasan tentang kesalahan konfigurasi Iv'e?

File status saya juga kosong :(

user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2

Memperbarui

Saya menghapus file status dan menjalankan logrotate secara paksa dan sekarang lognya terlihat seperti diputar dan file status terlihat lebih menjanjikan!

sudo rm /var/lib/logrotate/status

sudo /usr/sbin/logrotate -f /etc/logrotate.conf
Maleakhi
sumber

Jawaban:

17

Saya pikir itu weeklyberarti logrotate ingin melihat entri lama setidaknya satu minggu untuk file access.log Anda untuk memutarnya.

Karenanya masalahnya adalah Anda tidak menyimpan entri status untuk memicu rotasi.


Berikut ini adalah contoh langkah sederhana dari kasus sederhana, tentang bagaimana logrotate memutuskan untuk memutar file log
(ini adalah jalur fedora, Ubuntu, Centos dll. Mungkin berbeda)

(Saya membuat beberapa permintaan http://localhostsehingga ada beberapa entri di access_log, kalau tidak, logrotate tidak pernah berputar ...)

Jadi saya telah menetapkan logrotate saya untuk apache menjadi mingguan seperti itu;

/var/log/httpd/*log {
        weekly
...
}

dan awalnya tidak ada entri dalam /var/lib/logrotate.statusfile

# grep access_log /var/lib/logrotate.status
<- nothing

Jadi logrotate tidak memutar access_logfile;

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 ...
considering log /var/log/httpd/access_log
  log does not need rotating

Namun jika saya menjalankan logrotate secara manual seperti itu;

#  /usr/sbin/logrotate   /etc/logrotate.d/httpd 

sekarang ada entri di file status untuk httpd access_log;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-5-11

Namun apache masih tidak akan memutar log, karena entri hanya berumur 0 hari (2012-5-11);

  #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 considering log /var/log/httpd/access_log
   log does not need rotating

Namun jika Anda mengedit file status dengan vi vi /var/lib/logrotate.statusmaka sesuatu seperti ini untuk mengatur tanggal menjadi lebih dari seminggu ...;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-4-11    <---    more than a week ago..

Kemudian logrotate sekarang dengan benar memutar file karena tanggal dalam file negara 2012-4-11lebih dari seminggu yang lalu dari hari ini2012-5-11

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd
 considering log /var/log/httpd/access_log
 log needs rotating           <---    logrotate rotates the file.

(ingat bahwa -dpenyebabnya adalah dry-run, karenanya hanya berguna untuk memeriksa, Anda harus benar-benar menjalankan perintah tanpa -dmembuat entri status atau memutar file, dll.)

Tom H
sumber
1
File log memang memiliki entri jauh lebih dari seminggu - Tampaknya akan berfungsi sekarang, namun saya kira saya akan mencari tahu seminggu dari sekarang ...
Maleakhi
2
Maaf, saya bisa lebih jelas dalam jawabannya, tapi saya pikir untuk rotasi mingguan diperlukan entri dalam file /var/lib/logrotate.statusdengan tanggal setidaknya berumur seminggu. Saya memperbarui jawabannya dengan sebuah contoh ...
Tom H
Terima kasih atas penjelasan yang jelas - Saya benar-benar mengerti tentang sisi tanggal hal-hal, hanya saja mereka tidak memutar kecuali saya secara manual memanggil perintah ... Seolah-olah CRON tidak memanggil memutar log?
Maleakhi
Saya relatif baru dalam administrasi Linux ... Di dalam /etc/cron.daily/logrotate/ ada: #! / Bin / sh test -x / usr / sbin / logrotate || keluar 0
Maleakhi
7
log does not need rotating

Ini bisa jadi karena Anda log file kosong.
Situasi ini dapat terjadi karena apache masih menulis di file log sebelumnya, yang telah diubah namanya tanpa memulai ulang apache. Jadi access.log menjadi access.log.1 dan apache menulis ke dalamnya.

Atau Anda memiliki masalah dengan waktu pembuatan log:

ls -al --time=ctime /var/www/user/site.com/logs/
Gregory MOUSSAT
sumber
Anda dapat mengomentari notifemptybaris untuk menangani log 0 byte yang tidak berputar. Maka Anda akan ingin touchfile log baru sebelum setiap tes sehingga logrotate memiliki sesuatu untuk diputar.
Banjer
6

Saya menghadapi masalah yang sama kecuali tidak ada jawaban yang membantu saya. File log saya besar dan tua, konfigurasi saya 100% ok dan valid, menghapus file status tidak membantu.

Ternyata masalahnya adalah dalam entri logrotate duplikat . Ketika saya menjalankan logrotate secara manual pada file konfigurasi saya hanya seperti itu:

logrotate -df /etc/logrotate.d/my_service_name

itu tidak menunjukkan kesalahan, itu hanya mengatakan:

log does not need rotating

Saya masih tidak tahu mengapa sebenarnya. Tetapi ketika saya menjalankan perintah logrotate lengkap seperti itu:

logrotate -f /etc/logrotate.conf

Saya mendapat baris berikut:

error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log

Ternyata file konfigurasi logrotate untuk layanan saya berisi entri untuk memutar log akses nginx serta log layanan itu sendiri. Dan itu bertentangan dengan konfigurasi ngnix logrotate, yang memiliki aturan untuk semua entri nginx:

# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {

Jadi solusi untuk kasus saya cukup sederhana: Saya hanya perlu menghapus aturan rotasi nginx log yang bertentangan dari konfigurasi saya .

Saya kira logrotate mulai membatalkan file pemrosesan pada konflik aturan hanya dari salah satu versi terbaru. Saya mendapatkan kesalahan ini dengan v.3.8.7 tetapi di bawah v.3.7.8 dengan konfigurasi konflik yang sama ia menulis kesalahan yang sama tetapi berputar dengan baik. Meskipun saya tidak dapat menemukan catatan apa pun di logelate changelog.

Innokenty
sumber
Anda tampaknya benar tentang versi terbaru. Saya juga punya entri rangkap; tetapi saat menjalankan logrotate secara manual; itu bekerja dengan baik. Pada malam hari nilai kembali 0; tapi itu tidak berjalan dengan benar ...
Chris Maes
2

Coba jalankan sudo logrotate -f --verbose /etc/logrotate.d/apache2 Lihat apa yang tertulis di konsol, dan perbaiki apa pun yang salah.

Aminah Nuraini
sumber
0

Saya memiliki mesin Debian 7 yang, setelah pembaruan sistem, tidak memutar log surat lagi. Semua log lain selain yang mail diputar dengan benar. Saya menemukan bahwa log surat telah bertambah beberapa gigabyte. Saya selalu mengatur rotasi log melalui Webmin. Kemudian, berlari logrotate -d /etc/logrotate.confsaya melihat pesan berikut:

Ignoring rsyslog.dpkg-old, because of .dpkg-old ending

Ternyata entri rotasi email saya terdaftar /etc/logrotate.d/rsyslog.dpkg-old, yang diabaikan! Mengganti nama file memperbaiki rotasi file log :-)

lucaferrario
sumber