Logrotate ไม่ทำงาน


18

ฉันกำลังพยายามให้ logrotate ทำงานบน VPS ของฉันเพื่อหมุนไฟล์ apache ของฉันทุกสัปดาห์ ปัจจุบันเนื้อหาของไฟล์กำหนดค่า apache2 เป็นเช่นนี้

"/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
}

ฉันทิ้งไว้สองสัปดาห์แล้วและไม่มีอะไรเปลี่ยนแปลงเท่าที่ฉันจะบอกได้ เมื่อฉันจำลองจากบรรทัดคำสั่งฉันได้รับผลลัพธ์ต่อไปนี้

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

มีความคิดเห็นเกี่ยวกับสิ่งที่ Iv'e กำหนดค่าผิดหรือเปล่า?

ไฟล์สถานะของฉันว่างเปล่าด้วย :(

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

ปรับปรุง

ฉันลบไฟล์สถานะและบังคับให้ใช้งาน logrotate และตอนนี้ไฟล์บันทึกดูเหมือนว่าพวกมันถูกหมุนและไฟล์สถานะนั้นดูมีแนวโน้มมากกว่า!

sudo rm /var/lib/logrotate/status

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

คำตอบ:


17

ฉันคิดว่านั่นweeklyหมายความว่า logrotate ต้องการดูรายการเก่าอย่างน้อยหนึ่งสัปดาห์สำหรับไฟล์ access.log ของคุณเพื่อหมุนมัน

ดังนั้นปัญหาดูเหมือนว่าคุณไม่ได้เก็บรายการของรัฐเพื่อกระตุ้นการหมุน


นี่คือตัวอย่างที่เรียบง่ายของกรณีของวิธีการที่ logrotate ตัดสินใจที่จะหมุนไฟล์บันทึก
(เหล่านี้เป็นเส้นทางของ fedora, Ubuntu, Centos ฯลฯ อาจแตกต่างกัน)

(ฉันขอให้สองสามรายการเพื่อhttp://localhostให้มีบางรายการใน access_log มิฉะนั้น logrotate จะไม่หมุน ... )

ดังนั้นฉันจึงตั้งค่า logrotate สำหรับ apache เป็นรายสัปดาห์เช่นนี้

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

และเริ่มแรกไม่มีรายการใน/var/lib/logrotate.statusไฟล์

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

ดังนั้น logrotate จะไม่หมุนaccess_logไฟล์

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

อย่างไรก็ตามถ้าฉันใช้ logrotate ด้วยตนเองเช่นนั้น

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

ขณะนี้มีรายการในไฟล์สถานะสำหรับ httpd access_log;

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

อย่างไรก็ตาม apache จะไม่หมุนบันทึกเพราะรายการมีอายุเพียง 0 วัน (2012-5-11);

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

อย่างไรก็ตามหากคุณแก้ไขไฟล์สถานะด้วย vi vi /var/lib/logrotate.statusดังนั้นสิ่งนี้เพื่อกำหนดวันที่มากกว่าหนึ่งสัปดาห์ ... ;

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

จากนั้น logrotate จะหมุนไฟล์อย่างถูกต้องเนื่องจากวันที่ในไฟล์สถานะ2012-4-11เป็นมากกว่าหนึ่งสัปดาห์ที่ผ่านมานับจากวันนี้2012-5-11

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

(โปรดจำไว้ว่า-dสาเหตุของการรันแบบแห้งจึงมีประโยชน์สำหรับการตรวจสอบเท่านั้นคุณจะต้องรันคำสั่งโดยไม่ต้อง-dสร้างรายการสถานะหรือหมุนไฟล์ ฯลฯ )


1
ล็อกไฟล์มีรายการเก่ากว่าสัปดาห์ - ดูเหมือนว่ามันจะทำงานได้ในขณะนี้ แต่ฉันเดาว่าฉันจะหาสัปดาห์จากนี้ ...
Malachi

2
ขออภัยฉันมีความชัดเจนมากขึ้นในคำตอบ แต่ฉันคิดว่าการหมุนเวียนรายสัปดาห์จำเป็นต้องมีรายการในไฟล์ที่/var/lib/logrotate.statusมีวันที่อย่างน้อยหนึ่งสัปดาห์ ฉันอัปเดตคำตอบด้วยตัวอย่าง ...
Tom H

ขอบคุณสำหรับคำอธิบายที่ชัดเจน - ฉันเข้าใจอย่างถ่องแท้เกี่ยวกับวันที่ของสิ่งต่าง ๆ มันเป็นแค่พวกมันไม่หมุนนอกเสียจากว่าฉันจะเรียกคำสั่งด้วยตนเอง ... ราวกับว่า CRON ไม่ได้เรียกบันทึกการหมุน
มาลาคี

ฉันค่อนข้างใหม่กับการดูแลระบบ Linux ... ภายใน /etc/cron.daily/logrotate/ มี: #! / bin / sh test -x / usr / sbin / logrotate || ออก 0
มาลาคี

7
log does not need rotating

อาจเป็นเพราะคุณล็อกไฟล์ว่างเปล่า
สถานการณ์นี้อาจเกิดขึ้นเนื่องจาก apache ยังคงเขียนในไฟล์บันทึกก่อนหน้าซึ่งถูกเปลี่ยนชื่อโดยไม่ต้องรีสตาร์ท apache ดังนั้น access.log จึงกลายเป็น access.log.1 และ apache เขียนลงไป

หรือคุณมีปัญหากับเวลาในการสร้างบันทึก:

ls -al --time=ctime /var/www/user/site.com/logs/

คุณสามารถคอมเม้นต์notifemptyบรรทัดเพื่อจัดการกับบันทึก 0 ไบต์ไม่หมุน จากนั้นคุณจะต้องการtouchไฟล์บันทึกใหม่ก่อนการทดสอบแต่ละครั้งดังนั้น logrotate จะมีบางอย่างที่ต้องหมุน
Banjer

6

ฉันเผชิญกับปัญหาที่คล้ายกันยกเว้นไม่มีคำตอบเหล่านี้ช่วยฉัน ล็อกไฟล์ของฉันใหญ่และเก่าการกำหนดค่าของฉันนั้นใช้ได้ 100% และใช้ได้การลบไฟล์สถานะไม่ได้ช่วยอะไร

กลับกลายเป็นปัญหาที่เกิดขึ้นอยู่ในที่ซ้ำกัน logrotate รายการ เมื่อฉันเรียกใช้ logrotate ด้วยตนเองในไฟล์ปรับแต่งของฉันเท่านั้น:

logrotate -df /etc/logrotate.d/my_service_name

มันไม่ได้แสดงข้อผิดพลาดใด ๆ เพียงแค่พูดว่า:

log does not need rotating

ฉันยังไม่รู้ว่าทำไมจริง แต่เมื่อฉันใช้คำสั่ง logrotate ที่สมบูรณ์เช่นนั้น

logrotate -f /etc/logrotate.conf

ฉันได้รับบรรทัดต่อไปนี้:

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

ปรากฎว่าไฟล์กำหนดค่า logrotate สำหรับบริการของฉันมีรายการสำหรับการหมุนบันทึกการเข้าถึง nginx เช่นเดียวกับบริการบันทึกตัวเอง และที่ขัดแย้งกับการกำหนดค่า ngnix logrotate ซึ่งมีกฎสำหรับรายการ nginx ทั้งหมด:

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

ดังนั้นวิธีแก้ปัญหาสำหรับกรณีของผมเป็นเรื่องง่ายสวย: ฉันเพิ่งมีการลบขัดแย้งกัน Nginx บันทึกการหมุนการปกครองจากการตั้งค่าของฉัน

ฉันคิดว่า logrotate เริ่มที่จะยกเลิกการประมวลผลไฟล์ตามกฎข้อขัดแย้งจากหนึ่งในเวอร์ชันล่าสุดเท่านั้น ฉันได้รับข้อผิดพลาดนี้ด้วย v.3.8.7 แต่ภายใต้ v.3.7.8 ด้วยการกำหนดค่าที่ขัดแย้งกันเดียวกันมันเขียนข้อผิดพลาดเดียวกัน แต่หมุนได้ดี แม้ว่าฉันจะไม่พบบันทึกใด ๆ ของสิ่งนั้นในบันทึกการเปลี่ยนแปลง


คุณดูเหมือนจะถูกต้องเกี่ยวกับรุ่นล่าสุด ฉันมีรายการที่ซ้ำกัน แต่เมื่อเรียกใช้ logrotate ด้วยตนเอง; มันใช้งานได้ดี ในคืนวันที่คืนค่า 0; แต่มันก็ไม่ได้ทำงานอย่างถูกต้อง ...
คริส Maes

2

ลองเรียกใช้sudo logrotate -f --verbose /etc/logrotate.d/apache2 ดูสิ่งที่เขียนในคอนโซลและแก้ไขสิ่งที่ผิด


0

ฉันมีเครื่อง Debian 7 ซึ่งติดตามการอัพเดทระบบไม่หมุนบันทึกเมลอีกต่อไป บันทึกอื่น ๆ ทั้งหมด แต่บันทึกเมลถูกหมุนเวียนอย่างถูกต้อง ฉันค้นพบว่าบันทึกเมลเติบโตขึ้นหลายกิกะไบต์ ฉันจัดการล็อกการหมุนเวียนผ่าน Webmin เสมอ จากนั้นทำงานlogrotate -d /etc/logrotate.confฉันเห็นข้อความต่อไปนี้:

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

มันออกมาว่ารายการการหมุนจดหมายของฉันมีการระบุไว้ใน/etc/logrotate.d/rsyslog.dpkg-oldซึ่งถูกละเว้น การเปลี่ยนชื่อไฟล์แก้ไขการหมุนของไฟล์บันทึก :-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.