Mongodb - วิธีที่เหมาะสมในการหมุนเวียนบันทึก


13

Mongo docsบอกว่าฉันทำได้:

  1. ใช้สัญญาณ -SIGUSR1 และรับบันทึกการเปลี่ยนชื่อเก่าและสวิตช์ปัจจุบัน
  2. ใช้ logrotate จากระบบปฏิบัติการ

ฉันต้องการความสามารถในการ logrotate ของระบบปฏิบัติการที่จะ zip ไฟล์เก่าและลบเก่าที่สุด แต่ไม่เห็นวิธีที่จะบอกกระบวนการ mongod เพื่อเปลี่ยนบันทึกปัจจุบันนอกเหนือจากการส่ง SIGUSR1

ดังนั้นฉันจึงเขียน

/var/log/mongodb/*.log {
    daily
    rotate 5
    compress
    dateext
    missingok
    notifempty
    sharedscripts
    postrotate
        /usr/bin/killall -SIGUSR1 mongod
        /usr/bin/killall -SIGUSR1 mongos
    endscript
}

ถึง /etc/logrotate.d/mongo

และตอนนี้รับ logfiles ที่มีชื่อดีจาก logrotate และ logfiles ว่างเปล่าเช่นmongodb.log.2013-09-18T23-49-44ร่องรอยของการสลับ SIGUSR1 วิธีการกำจัดหลัง?

คำตอบ:


11

copytruncate ทำงานได้ดีสำหรับการบันทึก

การกำหนดค่าที่คล้ายกับสิ่งนี้ควรทำงานให้คุณ:

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}

1
สิ่งนี้ใช้ไม่ได้กับ RedHat 6.5 บันทึกถูกหมุน แต่ไฟล์. log ดั้งเดิมยังคงเติบโตอย่างไม่มีข้อ จำกัด
Thomas Bratt

@ThomasBratt สิ่งนี้ถูกต้องเพราะไม่รีสตาร์ท mongo กระบวนการตัวจัดการไฟล์ยังคงเปิดอยู่ fwics วิธีนี้จะไม่ทำงานทั้งหมดที่ดี
Mxx

@ThomasBratt ลองดูคำตอบนี้stackoverflow.com/a/8396266/949859
Mxx

1
@Mxx Nice find - ดูเหมือนว่า copytruncate จะทำงานกับขั้นตอน postrotate เพื่อส่งสัญญาณไปยัง Mongo เพื่อตัด logfile
Thomas Bratt

16

ตั้งแต่ mongodb 3.0 คุณสามารถเปลี่ยนลักษณะการทำงานของ mongodb ด้วยพารามิเตอร์ logRotate เปลี่ยนใน /etc/mongod.conf

systemLog:
  logAppend: true
  logRotate: reopen

ดูเพิ่มเติมMongo คู่มือการใช้งาน

จากนั้นคุณสามารถใช้การกำหนดค่า logrotate นี้:

/var/log/mongodb/*.log {
    daily
    rotate 30
    size 50M
    compress
    dateext
    missingok
    notifempty
    sharedscripts
    postrotate
        /bin/kill -SIGUSR1 `cat /var/lib/mongodb/mongod.lock 2> /dev/null` 2> /dev/null || true
    endscript
}

ควรใช้ไฟล์ PID ที่สร้างจากไฟล์ปรับแต่ง .... ดูprocessManagement.pidFilePathในการกำหนดค่าหรือการตั้งค่า PIDFile ของไฟล์หน่วย SystemD ( /var/run/mongodb/mongod.pidสำหรับฉัน)
Gert van den Berg

15

เซิร์ฟเวอร์ขัดข้องสำหรับฉันถ้าคุณส่ง SIGUSR1 ไปยัง mongod หลังจากที่คุณย้าย logfile ออกไปแล้วด้วย logrotate

การกำหนดค่าต่อไปนี้ปลอดภัยสำหรับรุ่นที่ฉันทดสอบ - 2.6.6 บน ubuntu 12.04 - ตัวอย่างก่อนหน้านี้เกิดข้อผิดพลาดเซิร์ฟเวอร์ ใส่สิ่งนี้ลงใน /etc/logrotate.d/mongod:

/var/log/mongodb/mongodb.log {
    weekly
    missingok
    rotate 4
    compress
    notifempty
    create
    postrotate
        /usr/bin/pkill -USR1 mongod
        rm /var/log/mongodb/mongodb.log.????-??-??T??-??-??
    endscript
}

ดู: https://jira.mongodb.org/browse/SERVER-11087สำหรับรายละเอียดเพิ่มเติมและข้อเสนอแนะจาก Akshay Kumar ซึ่งฉันใช้ในการข้างต้น (ใช้สร้างแทน nocreate และ cp / dev / null ไปยังล็อกไฟล์)

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

ดู: https://github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c

ฉันได้ทำการทดสอบกับ

logrotate -v -f /etc/logrotate.d/mongod

ใช้งานได้ดีสำหรับฉันใน Mongo 2.6.11 บน CentOS 7
ทิม

ฉันต้องเปลี่ยน mongodb.log ด้วย mongod.log และใช้งานได้
cwhisperer

สามารถยืนยันได้ว่าหากsystemLog.logRotate: reopenเข้าใช้mongod.confแล้ว pkill จะทำงานได้ตามที่ต้องการและไม่จำเป็นต้องลบไฟล์บันทึกที่ถูกเปลี่ยนชื่อเนื่องจากไม่มีการสร้างใด ๆ
Julian H. Lam

0

การทำงานต่อไปนี้สำหรับฉัน:

/var/log/mongo/mongod.log {
    missingok
    rotate 3
    size 100M
    nodateext
    postrotate
            /usr/bin/kill -USR1 $(cat /var/run/mongod.pid)
            rm -f /var/log/mongo/mongod.log.[0-9][0-9][0-9][0-9]-*
    endscript
}

หมายเหตุ:

  • ทดสอบกับ RedHat 6.5
  • วิธีเดียวที่ฉันจะได้รับวิธีแก้ไขคือการลบไฟล์บันทึกที่ว่างเปล่าที่ Mongo สร้างขึ้น
  • ตำแหน่งของไฟล์ล็อคขึ้นอยู่กับการติดตั้ง MongoDB
  • killเป็น Bash builtin แต่ logrotate ทำงานภายใต้/bin/sh- ซึ่งไม่รู้จักSIGUSR1กับ RedHat 6.5
  • ฉันไม่ได้ทดสอบด้วยcompressแต่ควรเป็นการเพิ่มที่ตรงไปตรงมา

-1

โปรดทราบว่าในเวอร์ชัน 3.0 และสูงกว่านั้นไม่จำเป็นต้องฆ่า daemon ฐานข้อมูลของคุณเพียงเพื่อหมุนบันทึก อ้างถึงเอกสารที่นี่:

https://docs.mongodb.com/manual/tutorial/rotate-log-files/


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