Logrotate สำเร็จไฟล์ต้นฉบับจะกลับไปเป็นขนาดดั้งเดิม


11

มีใครเคยมีปัญหาใด ๆ กับ logrotate ก่อนที่จะทำให้ไฟล์ล็อกหมุนแล้วกลับไปที่ขนาดเท่าเดิม แต่เดิม? นี่คือสิ่งที่ฉันค้นพบ:

สคริปต์ Logrotate:

/var/log/mylogfile.log {
    หมุน 7
    ประจำวัน
    การบีบอัด
    olddir / log_archives
    missingok
    notifempty
    copytruncate
}

Verbose Output ของ Logrotate:

คัดลอก /var/log/mylogfile.log ไปที่ /log_archives/mylogfile.log.1
truncating /var/log/mylogfile.log
บันทึกการบีบอัดด้วย: / bin / gzip
ลบ log เก่า /log_archives/mylogfile.log.8.gz

ไฟล์บันทึกหลังจากการตัดทอนเกิดขึ้น

[root @ server ~] # ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 ส่วนที่ 1 ส่วนที่ 1 0 ม.ค. 11 17:32 / วาร์จี / log/mylogfile.log

ตัวอักษรวินาทีต่อมา:

[root @ server ~] # ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 ส่วนที่ 1 ส่วนที่ 1 3.5G 11 ม.ค. 17:32 /var/log/mylogfile.log

รุ่น RHEL:

[root @ server ~] # cat / etc / redhat-release 
Red Hat Enterprise Linux ES รีลีส 4 (อัพเดตล่าสุด 4)

เวอร์ชั่นของ Logrotate:

[root @ DAA21529WWW370 ~] # rpm -qa | grep logrotate
logrotate-3.7.1-10.RHEL4

หมายเหตุน้อย:

  • ไม่สามารถเริ่มบริการได้ทันทีนั่นคือสาเหตุที่ฉันใช้ copytruncate
  • บันทึกกำลังหมุนทุกคืนตามolddirไดเรกทอรีที่มีไฟล์บันทึกอยู่ในแต่ละคืน

คำตอบ:


18

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

od -c หลังจากตัดทอน + การเติบโตฉับพลันสร้างผลลัพธ์ตามบรรทัดของ:

0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
33255657600  \0   C   K   B   -   s   e   r   v   e   r       [   h   t   t
33255657620 <more log output>

สิ่งนี้บอกว่ามาจาก offset 0 ถึง 33255657600 ไฟล์ของคุณประกอบด้วย null bytes และจากนั้นข้อมูลบางอย่างที่อ่านได้ การเข้าสู่สถานะนี้ไม่ได้ใช้เวลาเท่ากันในการเขียนค่า null-bytes ทั้งหมด ระบบไฟล์ ext {2,3,4} สนับสนุนสิ่งที่เรียกว่าไฟล์ sparse ดังนั้นหากคุณค้นหาพื้นที่ของไฟล์ที่ไม่มีสิ่งใด ๆ ที่ผ่านมาภูมิภาคนั้นจะถือว่าเป็นไบต์ว่างและจะไม่ใช้พื้นที่ บนดิสก์ ไบต์ว่างเปล่าเหล่านั้นจะไม่ถูกเขียนเพียงแค่สมมติว่าอยู่ที่นั่นดังนั้นเวลาที่ใช้ในการไปที่ 0 ถึง 3.5GB จะใช้เวลาไม่นาน (คุณสามารถทดสอบระยะเวลาที่ใช้โดยการทำสิ่งdd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1นี้ควรสร้างไฟล์ที่มีขนาดเกิน 3GB ในเวลาไม่กี่มิลลิวินาที)

หากคุณใช้งานls -lsไฟล์บันทึกข้อมูลหลังจากที่ถูกตัดทอนและมีการเติบโตอย่างกะทันหันอีกครั้งตอนนี้ควรรายงานตัวเลขที่จุดเริ่มต้นของบรรทัดซึ่งแสดงขนาดจริง (เป็นบล็อกที่อยู่บนดิสก์) ซึ่งอาจเป็นคำสั่งขนาด ls -lขนาดเล็กกว่าขนาดที่มีการรายงานโดยเพียงแค่


ฉันไม่คิดอย่างนั้นในไม่กี่วินาทีล็อกไฟล์จะเปลี่ยนจาก 0 ไบต์เป็น 3.5GB เวลาทั้งหมดที่ใช้ในการรอให้เสร็จสิ้นคือประมาณ 5 นาที ไฟล์บันทึกไม่ได้ถูกเขียนขึ้นอย่างรวดเร็วและขนาดมักจะเป็นขนาดดั้งเดิมเสมอไปซึ่งดูเหมือนจะเกิดขึ้นโดยบังเอิญมากเกินไป
drewrockshard

ควรมีวิธีการตรวจสอบที่ง่ายตรวจสอบไฟล์และดูว่ามีอะไรอยู่ในนั้นหรือไม่ เริ่มต้นด้วยการเรียกใช้ od -c filename | ส่วนหัว -n 100 โอกาสที่จะบอกคุณในไม่กี่บรรทัดว่ามีปริมาณรถบรรทุกที่มีค่า null-bytes รวมถึงรายการบันทึกล่าสุด
Kjetil Joergensen

หากเป็นกรณีนี้เราสามารถทดสอบว่า cat / dev / null> /var/log/mylogfile.log จะตัดทอนไฟล์ด้วยวิธีที่แก้ปัญหานี้ได้หรือไม่แทนที่จะใช้ logrotate ที่สร้างขึ้นใน copytruncate?
mtinberg

2
ปัญหาไม่ได้อยู่กับวิธีที่ไฟล์ถูกตัดทอนปัญหาอยู่ที่โปรแกรมเขียน logfile สำหรับการตัดทอน logfile ให้เป็นแนวทางที่ใช้งานได้คุณจะต้องได้รับโปรแกรมที่เขียนไปยัง logfile เพื่อหาตำแหน่ง 0 เป็นไปได้ว่าระบบไฟล์ที่ไม่รองรับไฟล์ที่กระจัดกระจายจะไม่มีปัญหานี้ ตอนนี้ไม่มีวิธีการทดสอบใด ๆ
Kjetil Joergensen

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

2

ฉันมั่นใจอย่างยิ่งว่า Kjetil ได้โจมตีมัน ดึงคุณอาจยังไม่เชื่อโดยคำอธิบายของเขา แต่ฉันขอให้คุณอ่านอย่างระมัดระวังสิ่งที่เขาพูด

หากคุณยอมรับการแก้ไขจะเป็นการหยุดและรีสตาร์ทแอปพลิเคชันของคุณเมื่อมีการหมุนบันทึกหรือใช้เครื่องมือเช่น "rotatelogs" ของ Apache ซึ่งคุณป้อนฟีดบันทึกการทำงานไปยังเครื่องมือผ่านทางไพพ์และเครื่องมือจะดูแล การหมุนล็อกไฟล์ทุก ๆ ครั้ง ตัวอย่างเช่นหนึ่งในอินสแตนซ์ apache ของฉันบันทึกด้วย

ErrorLog "|/usr/sbin/rotatelogs /www/logs/error_log 604800"

ซึ่งทำให้ logfiles จำนวนมากที่มีชื่อชอบ

-rw-r--r--    1 root     root         4078 Dec 21 01:04 error_log.1292457600
-rw-r--r--    1 root     root         4472 Dec 29 08:41 error_log.1293062400
-rw-r--r--    1 root     root        78630 Jan  4 12:57 error_log.1293667200
-rw-r--r--    1 root     root        15753 Jan 12 01:10 error_log.1294272000

ปรากฏโดยไม่ต้องรีสตาร์ท apache ฉันสามารถบีบอัดมันด้วยตนเองหลังจากข้อเท็จจริง หมายเหตุวิธีการหมุนจะทำทุกสัปดาห์ซึ่งเป็นทุก 604800 rotatelogsวินาทีที่ถูกโต้แย้งผ่านไป

หากคุณไม่สามารถหยุดและรีสตาร์ทแอปได้และไม่สามารถล็อคอินผ่านไปป์ได้ฉันคิดว่าคุณมีปัญหาจริง บางทีคนอื่นอาจมีข้อเสนอแนะ


0

มันจะดีมากถ้าคุณสามารถส่ง logrotate ทั้งหมด

ทำไมต้องลองใช้ kill -HUP (การโหลดแบบเดิมไม่รีสตาร์ท ) วิธี

นอกจากนี้ ... ตรวจสอบกับlsof ผู้ที่กำลังเข้าถึงไฟล์


ไม่สามารถใช้งานได้kill -HUPเนื่องจากแอปพลิเคชันนี้ไม่สามารถแตะต้องได้ - เป็นแอปพลิเคชันที่ละเอียดอ่อนที่ฉันไม่ได้เป็นเจ้าของ (ฉันไม่ได้จัดการมัน - ฉันจัดการด้าน OS เท่านั้น) ดังนั้นฉันจึงต้องสามารถบันทึกสิ่งนี้ได้ ทาง
drewrockshard

1
ขออภัยข้อความต้นฉบับส่งมาก่อนนี่คือข้อความต้นฉบับที่เหลือของฉัน:ฉันเข้าสู่ระบบในเช้าวันนี้และตอนนี้ไฟล์กลับมาเป็นปกติหลังจากที่/etc/cron.dailyเริ่มการล็อกเอาต์ตามกำหนด คำถามทั้งหมด: มีบางสิ่งที่สคริปต์ logrotate แตกต่างจากการใช้ logrotate ด้วยตนเองหรือไม่? สคริปต์ logrotate ของฉันดูเหมือน/usr/sbin/logrotate /etc/logrotate.confจริง มันค่อนข้างงงงัน
drewrockshard

-1

เพียงแค่ใช้ ">>" ซึ่งหมายถึงการผนวกแทน ">" ซึ่งหมายถึงการสร้างจากสคริปต์ของคุณที่เขียนไปยังไฟล์นี้ ฉันมีปัญหาเดียวกันที่แน่นอนและฉันแก้ไขโดยใช้ผนวกในสคริปต์ของฉัน

SomeScript.sh >> output.txt

หวังว่าชัดเจน


ไม่มีข้อบ่งชี้ว่าการเขียนไปยังล็อกไฟล์นั้นทำได้โดยใช้>จากสคริปต์ ยิ่งไปกว่านั้นคำตอบนี้ทำให้สับสนเพราะมีความแตกต่างที่สำคัญระหว่าง>และ>( )ในสคริปต์ ในที่สุดหากโค้ดที่ทำการเขียนถูกอัพเดตมันจะเป็นการดีกว่าถ้าคุณเริ่มเขียนไปยังไฟล์บันทึกการทำงานใหม่หลังจากlogrotateทำสิ่งนั้นเสร็จแล้ว
kasperd

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