วิธี logrotate บันทึกการบริการที่ถูกจัดการโดย systemd ผ่านไฟล์ config

Aug 19 2020

ฉันมีบริการที่จัดการโดย systemd ที่มีการกำหนดค่า systemd ต่อไปนี้บอกให้ systemd เขียนบันทึกไปยังไฟล์โดยตรง (ไม่มี syslog หรืออะไรเลย)

StandardOutput=file:/var/log/foo/my.log

ฉันมีกฎ logrotate

/var/log/foo/*.log
{
        rotate 31
        daily
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
}

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

ฉันมีการตั้งค่าการทำงานที่คล้ายกันโดยที่บริการเขียนไปที่ syslog แทน อันนี้ใช้ได้ดีเพราะ logrotate config มี

postrotate
                invoke-rc.d rsyslog rotate > /dev/null

ซึ่งจะแจ้งให้ syslog ทราบว่ามีการหมุนล็อก

ปัญหาคือในกรณีที่เป็นปัญหาของฉันบันทึกจะเข้าสู่ไฟล์โดยตรงดังนั้นฉันจึงไม่รู้ว่า (หรืออันไหน) ฉันต้องการส่งสัญญาณที่คล้ายกันไปยัง systemd หรือไปยังกระบวนการบริการจริง

ฉันพบcopytruncateตัวเลือกใน logrotate ซึ่งฉันค่อนข้างแน่ใจว่าจะแก้ไขปัญหาของฉันได้ แต่ฉันรู้สึกว่านี่ไม่ใช่วิธีที่ดีที่สุดที่จะทำมิฉะนั้นcopytruncateจะเป็นพฤติกรรมเริ่มต้นของ logrotate

ฉันจะแก้ปัญหานี้ได้อย่างไร? ฉันต้องส่งสัญญาณไปที่ systemd หรือไม่? ฉันต้องส่งสัญญาณไปยังกระบวนการบริการหรือไม่? ฉันต้องใช้copytruncateใน logrotate แทนหรือไม่?
หากมีความสำคัญบริการนี้เป็นกระบวนการ java โดยใช้ logback เพื่อเขียนไปยัง stdout

คำตอบ

eleventyone Aug 18 2020 at 22:32

copytruncateเป็นคำตอบที่ถูกต้องในกรณีนี้ ไม่ใช่ค่าเริ่มต้นเนื่องจากไม่จำเป็นต้องใช้เนื่องจากคุณมี daemon ที่เหมาะสมซึ่งคุณสามารถส่งสัญญาณให้เปิดไฟล์บันทึกใหม่ได้

อีกทางเลือกหนึ่งคือการเริ่มบริการใหม่ในสคริปต์หลังการหมุน แต่อาจไม่สะดวกหรือไม่ต้องการ