Rsyslog หยุดส่งข้อมูลไปยังเซิร์ฟเวอร์ระยะไกลหลังจากการหมุนบันทึก


9

ในการกำหนดค่าของฉันฉันได้ rsyslog ผู้ที่อยู่ในความดูแลของการเปลี่ยนแปลงต่อไปของการใช้/home/user/my_app/shared/log/unicorn.stderr.log imfileเนื้อหาถูกส่งไปยังเซิร์ฟเวอร์บันทึกข้อมูลระยะไกลอื่นโดยใช้ TCP

เมื่อล็อกไฟล์หมุน rsyslog หยุดส่งข้อมูลไปยังเซิร์ฟเวอร์ระยะไกล

ฉันลองโหลด rsyslog ใหม่ส่งสัญญาณ HUP และเริ่มต้นใหม่พร้อมกัน แต่ไม่มีอะไรทำงาน

วิธีเดียวที่ฉันจะพบว่าใช้งานได้จริงสกปรก:

  • หยุดบริการลบไฟล์ rsyslog stat และเริ่ม rsyslog อีกครั้ง ทั้งหมดที่อยู่ในเบ็ด postrotate ในไฟล์ logrotate ของฉัน
  • kill -9 rsyslog และเริ่มต้นใหม่

มีวิธีที่เหมาะสมสำหรับฉันที่จะทำเช่นนี้โดยไม่ต้องสัมผัส rsyslog internals?

ไฟล์ Rsyslog

$ ModLoad ตราสัญลักษณ์
$ ModLoad ไม่ทำงาน
$ ModLoad imtcp
$ ModLoad imuxsock
$ ModLoad imklog
$ ModLoad imfile

$ เทมเพลตโดยไม่ต้องมีรูปแบบ "[สภาพแวดล้อม] [% syslogtag%] -% msg%"

$ WorkDirectory / var / spool / rsyslog

$ InputFileName /home/user/my_app/shared/log/unicorn.stderr.log
$ InputFileTag unicorn-stderr
$ InputFileStateFile สถิติยูนิคอร์น-stderr
ข้อมูล $ InputFileSeverity
$ InputFileFacility local8
$ InputFilePollInterval 1
$ InputFilePersistStateInterval 1
$ InputRunFileMonitor

# ส่งต่อไปยังเซิร์ฟเวอร์ระยะไกล
ถ้า $ syslogtag มี 'apache-' ดังนั้น @@ my_server: 5000; WithoutTimeFormat
: syslogtag, มี, "apache-" ~

*. * @@ my_server: 5000; SyslFormat

ไฟล์บันทึก

/home/user/my_app/shared/log/*.log {
  ประจำวัน
  missingok
  dateext
  หมุน 30
  การบีบอัด
  notifempty
  นามสกุล gz
  copytruncate
  สร้างผู้ใช้ 640 คน
  sharedscripts
  โพสต์หมุน
    (หยุด rsyslog && rm / var / spool / rsyslog / stat- * && เริ่ม rsyslog 2> & 1) || จริง
  endscript
}

FYI ไฟล์สามารถอ่านได้สำหรับผู้ใช้ rsyslog เซิร์ฟเวอร์ของฉันสามารถเข้าถึงได้และไฟล์บันทึกอื่น ๆ ที่ไม่หมุนในรอบเดียวกันยังคงถูกติดตามอย่างถูกต้อง

ฉันใช้ Ubuntu 12.04

คำตอบ:


8

ปัญหาเกิดขึ้นจริงจาก logrotate

โดยพื้นฐานแล้วด้วยการกำหนดค่าของฉันใช้ยูนิคอร์นฉันไม่จำเป็นต้องใช้copytruncateคำสั่ง (ซึ่งเป็นสาเหตุของปัญหาที่นี่)

USR1 - เปิดบันทึกทั้งหมดที่เป็นของกระบวนการผู้ปฏิบัติงานอีกครั้ง ดูยูนิคอร์น :: Util.reopen_logs สำหรับสิ่งที่ถือว่าเป็นบันทึก ไฟล์บันทึกจะไม่ถูกเปิดอีกครั้งจนกว่ามันจะทำการประมวลผลคำขอปัจจุบันดังนั้นหลาย ๆ สายการบันทึกสำหรับการร้องขอหนึ่งครั้ง (ตามที่ทำโดย Rails) จะไม่ถูกแยกในหลาย ๆ บันทึก

สิ่งนี้เริ่มทำงานอย่างถูกต้องหลังจากอัพเดตเป็นคอนฟิกูเรชันนี้:

/home/user/my_app/shared/log/*.log {
  daily
  missingok
  dateext
  rotate 30
  compress
  notifempty
  extension gz
  create 640 user user
  sharedscripts

  post-rotate
    # Telling Unicorn to reload files
    test -s /home/user/my_app/shared/pids/unicorn.pid && kill -USR1 "$(cat /home/user/my_app/shared/pids/unicorn.pid)"

    # Reloading rsyslog telling it that files have been rotated
    reload rsyslog 2>&1 || true
  endscript
}

หากสิ่งเหล่านี้เป็นสำเนาโดยตรงของไฟล์ของคุณฉันคิดว่าปัญหาของคุณคือว่าคุณกำลังใช้post-rotate(ซึ่งไม่ใช่สิ่ง) แทนpostrotateเพราะสคริปต์ logrotate ดั้งเดิมที่คุณควรทำงานได้ดีกับ rsyslog (ถ้าสคริปต์ postrotate ทำงานอยู่ ) ...
mltsy

2
ผมจำไม่ได้เมื่อ แต่ฉันไม่เปลี่ยนแปลงสำหรับpost-rotate lastactionความคิดเห็นของคุณยังคงสมเหตุสมผลและอาจแก้ไขปัญหาของฉันได้ในเวลา :) สำหรับการบันทึกฉันจะหลีกเลี่ยงการใช้copytruncateในอนาคตเพราะมันช้าและเล่นกับการจัดการไฟล์
Vincent B.

2

ไฟล์ logrotate ของคุณมีรายการสำหรับ/home/user/shared/log/*.logซึ่งไม่ตรงกับ logfile /home/user/my_app/shared/log/unicorn.stderr.logของคุณ คุณต้องเพิ่มรายการ logrotate สำหรับไดเรกทอรีนั้นและตรวจสอบให้แน่ใจว่ามันมีcopytruncate- อย่างที่มันเป็น rsyslog กำลังเปลี่ยนชื่อไฟล์ปัจจุบันและสร้างรายการใหม่และ imfile จะติดตาม filehandle ของไฟล์ที่เปลี่ยนชื่อตอนนี้


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