เหตุผล:“ บันทึกไม่จำเป็นต้องหมุน” เพราะเหตุใด


57

ฉันมีการกำหนดค่า logrotate ใหม่ดังต่อไปนี้:

/var/log/nexus/nexus.log {
    rotate 7
    missingok
    compress
    delaycompress
    copytruncate
    daily
}

เมื่อฉันวิ่งlogrotate -d nexusฉันได้รับสิ่งต่อไปนี้:

reading config file nexus
reading config info for /var/log/nexus/nexus.log

Handling 1 logs

rotating pattern: /var/log/nexus/nexus.log  after 1 days (7 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/nexus/nexus.log
  log does not need rotating

โฟลเดอร์ / var / log / nexus / ของฉันมีสิ่งต่อไปนี้:

nexus.log
oldlogs.tar.gz

เหตุใด LogRotate จึงไม่หมุนไฟล์ nexus.log สิ่งที่ฉันคาดหวังคือไฟล์ nexus.log จะถูกตัดทอนและไฟล์ใหม่บางอย่างเช่น nexus.log-201106241000 จะถูกสร้างขึ้น


นอกจากนี้โปรดจำไว้ว่าเมื่อคุณใช้ตัวเลือก -d มันจะไม่บันทึกการหมุน มันแสดงให้คุณเห็นสิ่งที่มันจะทำงานโดยไม่มีตัวเลือกเช่นแผนเกม ทำให้ฉันปวดหัวอย่างรุนแรงเมื่อฉันคิดว่าฉันเห็นพวกเขาหมุนแล้วพวกเขาก็ยังอยู่ที่นั่น
Maxwell Flanders

คำตอบ:


64

เป็นไปได้มากที่สุดว่าไฟล์บันทึกนั้นมีอายุน้อยกว่าหนึ่งวันและ / หรือถูกหมุนภายในวันสุดท้ายและ logrotate จะจดจำประวัติ

หากคุณเพิ่ม-fมันจะบังคับให้มีการหมุนเวียนหากคุณต้องการ (แม้ว่าจะไม่ 100% แน่ใจว่าวิธีการโต้ตอบกับ-d)

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


4
ใน FreeBSD มัน /var/run/logrotate.status
kaleissin

ตรวจสอบการใช้อาร์กิวเมนต์ -s ที่เป็นไปได้ในการเรียกใช้ตำแหน่งไฟล์สถานะ
JGurtz

2
-d+ -fทำให้รายงาน logrotate "ต้องการหมุน" สำหรับไฟล์ทุกคนแม้กระทั่งคนที่ไม่ตรงกัน
ปุย

หากต้องการเพิ่มสิ่งนี้การแก้ไขวันที่ในไฟล์สถานะให้เก่ากว่านโยบายการหมุนก็เพียงพอที่จะโน้มน้าวใจว่าlogrotateมันต้องหมุนบันทึกเมื่อมันทำงานอีกครั้ง
Centimane

บน CentOS ฉันแก้ไข /var/lib/logrotate.status เพื่อให้ logrotate ทำงาน ตามที่ระบุไว้โดย EightBitTony logrotate รายวันจะจดจำประวัติ เว้นแต่ว่าไฟล์ดังกล่าวมีประวัติพร้อมกับวันที่แล้วในอดีต logrotate จะไม่หมุนไฟล์
ทำเครื่องหมาย

58

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

เมื่อมันทำงานในวันต่อมาก็จะเห็นว่าบันทึกเป็นวันเก่าและหมุนตามที่คาดไว้ หากคุณไม่ต้องการรอให้แก้ไขไฟล์สถานะของ logrotate แล้วห่านวันที่สถานะสำหรับบันทึกของคุณกลับไปยังวันก่อนหน้า

เมื่อคุณเรียกใช้ logrotate ด้วยตนเองมันจะทำงานตามที่คาดไว้


5

บางครั้งแม้ว่าคุณจะเรียกใช้ logrotate ด้วยตนเองสิ่งนี้จะไม่ทำงานหากคุณทำในวันเดียวกันและมีdateextค่าเริ่มต้นที่ไม่รวม senconds (เช่น-%Y%m%d) ไม่แม้ว่าคุณจะแก้ไขไฟล์สถานะของ logrotate หรือเมื่อใช้คำสั่งขนาด (เช่นsize 200M) อย่างน้อยใน CentOS 6 logrotate จะล้มเหลวในการหมุนไฟล์บันทึกของคุณเพราะมันมีอยู่แล้ว

เพื่อแก้ปัญหานี้คุณจำเป็นต้องใช้dateformatแทนซึ่งมีมูลค่าที่ชอบ:dateext%Y%m%d%s

ดูman logrotateข้อมูลเพิ่มเติม


1

ระวังด้วยการวิ่ง

logrotate -vdf /etc/logrotate.conf

เหตุการณ์แม้ว่าการจำลองเท่านั้นจะถูกบันทึกไว้/var/lib/logrotate.status และการเรียกใช้ logrotate ที่ตามมาจะตอบกลับด้วยการกล่าวถึง

log does not need rotating

1
ฉันไม่สามารถทำซ้ำได้บน Ubuntu (16.04 และ 17.04) หากใช้ "/var/lib/logrotate.status" คุณจะต้องใช้ distro อื่น Ubuntu บันทึกการ "/ var / lib / logrotate / status"
Philipp Claßen

2
@Philipp Claßen: คุณถูกต้อง (ไฟล์สถานะถูกวางไว้ที่/var/lib/logrotate.status) ถูกตรวจพบขณะทำการดีบักการกำหนดค่า Logrotate 3.10 บน Alpine linux 3.5 ภายในคอนเทนเนอร์ของนักเทียบท่า แต่ไม่มีการตั้งค่าสถานะของ Ubuntu ในการกำหนดคำถามใช่ไหม
helvete

1
ใช่มันไม่เป็นไร ฉันจะพูดถึงมันเพราะ Ubuntu เป็นที่นิยมมาก ฉันคิดว่าหลายคนอ่านคำถามนี้เพราะพวกเขาต้องการแก้ไขเซิร์ฟเวอร์ของพวกเขาซึ่งวันนี้มักจะทำงานกับ Ubuntu
Philipp Claßen

1
ตกลงนั่นถูกต้อง จะแล้วเสร็จฉันสามารถเพิ่มว่า locationo ของไฟล์สถานะที่ Centos 7 distro เป็น at/var/lib/logrotate/logrotate.status
helvete
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.