พุ่งพรวดไม่เปิดไฟล์บันทึกเมื่อมีการล็อก


10

เราใช้การเริ่มต้นเพื่อจัดการบริการของเราบนเซิร์ฟเวอร์ Ubuntu พวกเขาสร้างบันทึกที่ออกจากระบบเพื่อ /var/log/upstart/SERVICE_NAME.log

จากนั้นทุกวันไฟล์บันทึกจะถูกหมุนโดยใช้สคริปต์ logrotation ซึ่งมาพร้อมกับ 12.04 LTS:

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

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

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 

เห็นได้ชัดว่าฉันสามารถเปลี่ยนเส้นทางผลลัพธ์จากบริการของฉันเองไปยังไฟล์บันทึกอื่น ๆ แต่ปัญหาจะยังคงอยู่ที่นั่นสำหรับกระบวนการของระบบ นอกจากนี้ฉันไม่ต้องการสร้างโครงสร้างพื้นฐานมากกว่าที่ฉันต้องการ


ฉันเพิ่งพบสิ่งนี้ มันแปลกมากที่เราไม่ได้สังเกตเห็นมาก่อนซึ่งทำให้ฉันคิดว่ามันอาจเป็นสิ่งล่าสุด
pwaller

1
มีการอัพเดทอะไรบ้าง? เห็นปัญหาเดียวกันแน่นอนใน 14.04 มันเป็นเพราะของnocreateคำสั่ง, ไม่แน่ใจว่าทำไมทุกคนจะใช้คำสั่งนี้โดยเฉพาะอย่างยิ่งสำหรับบริการที่อาจเขียนจำนวนมากเอาท์พุท
rynop

ยังประสบกับสิ่งนี้
Ztyx

คำตอบ:


2

ฉันเชื่อว่าคุณมี 3 ตัวเลือก

  1. คุณปรับเปลี่ยนการกำหนดค่าที่มีอยู่โดยเพิ่ม "copytruncate"

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

  2. หากคุณไม่สามารถหรือ (ไม่ได้รับอนุญาต) ให้เปลี่ยนการกำหนดค่า logrotate ที่มีอยู่เนื่องจากไฟล์บันทึกอื่น ๆ ที่ไม่ประสบและการกำหนดค่าที่มีอยู่ใช้งานได้ให้ย้ายไฟล์ "SERVICE_NAME.log" ไปยังโฟลเดอร์ใหม่ภายใต้ / var / log หากคุณต้องการสร้างการกำหนดค่าใหม่ด้วย "copytruncate" และเพิ่มลงใน cron.daily

  3. a) หากคุณไม่ได้รับอนุญาตให้เปลี่ยนการกำหนดค่าโฮสต์ os logrotate หรือเพิ่มลงใน cron.daily ของโฮสต์ระบบปฏิบัติการตัวเลือกที่สามของคุณคือการเปลี่ยนสคริปต์หรือโปรแกรมเพื่อตรวจสอบว่ามีไฟล์อยู่ก่อนเขียนลงในไฟล์ b) อีกวิธีคือจุดที่ 2 ด้านบนซึ่งเป็นการย้าย logfiles ของคุณไปที่อื่นและภายในสคริปต์หรือโปรแกรมของคุณให้รันคำสั่ง logrotate เฉพาะสำหรับไฟล์บันทึกของโปรแกรมนั้น

จุดที่ 3b ด้านบนนั้นยุ่งยากกว่า แต่ก็ดูดีกว่าและมันก็เป็นสิ่งที่ฉันใช้เวลาส่วนใหญ่เพราะมันหมายถึงว่าโปรแกรมนั้นมีความพอเพียงและจัดการตัวเองได้และไม่จำเป็นต้องใช้งานระบบปฏิบัติการเพื่อดูแลมัน

หากต้องการค้นหาวิธีเรียกใช้ logrotate ด้วยตนเองและเพิ่มลงในโปรแกรมหรือสคริปต์ของคุณเพียงแค่พิมพ์:

man logrotate

หรือ

logrotate --help

หากคุณใช้ Python สำหรับโปรแกรมของคุณคุณสามารถตรวจสอบว่าโปรแกรมนี้ใช้เพื่อจัดการไฟล์บันทึกด้วยตนเองได้อย่างไร http://bazaar.launchpad.net/~ferncasado/keep.awake/trunk/files/head:/v4/


0

ปรากฎว่าเป็นปัญหาที่ทราบแล้วและตั๋วยังคงเปิดอยู่ในขณะที่ฉันพิมพ์

สิ่งที่ถูกต้องที่ควรทำคือเพียงลบไฟล์/etc/logrotate.d/upstartทั้งหมดและหมุนไฟล์ของแต่ละบริการ เนื่องจากไดเรกทอรี ( /var/log/upstart/) มีเฉพาะ stdout / stderr ของบริการต่าง ๆ - และไม่มีบริการที่ตั้งใจให้ทำงานในฐานะdaemonควรจะส่งออกไปยังสองช่องทางเหล่านี้เลย ยกเว้นบางทีในตอนเริ่มต้น

บนระบบฉันจัดการสามบริการจะดำเนินการโดยพุ่งพรวด: php5.6-fpm, และphp7.1-fpm acpidไม่มีบันทึกสามรายการใดที่ใช้งานได้ แต่บางครั้งมีการเริ่มต้นใหม่ fpm เนื่องจากไฟล์บันทึกหลัก ( /var/log/php5.6-fpm.log) กำลังหมุน - และทำให้เกิดสัญญาณรบกวนนี้

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

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

เพื่อให้การทำงานข้างต้นต้องแน่ใจว่าไม่ได้ใช้sharedscriptsกริยาในนั้น - scriptlet ของฉันขึ้นอยู่กับความจริงเส้นทางที่แท้จริงไปยังไฟล์จะถูกส่งผ่านไปเป็นอาร์กิวเมนต์แรก ( $1)

(การเปลี่ยนเส้นทางไป/dev/nullยังมีประโยชน์เนื่องจากservice- คำสั่งนั้นมีเสียงดัง - และคุณไม่ต้องการเสียงรบกวนดังกล่าวทางอีเมลถึงคุณโดย cron สังเกตว่าฉันไม่ได้เปลี่ยนเส้นทางที่stderrนั่นเพียงstdout- ถ้ามีปัญหาคุณ คุณจะยังได้รับอีเมลของคุณเกี่ยวกับเรื่องนี้)

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