Mongodb - cách thích hợp để xoay vòng gỗ


13

Tài liệu Mongo nói rằng tôi có thể:

  1. sử dụng tín hiệu -SIGUSR1 và đổi tên nhật ký cũ và chuyển đổi hiện tại
  2. sử dụng logrotate từ hệ điều hành

Tôi muốn khả năng logrotate của HĐH để nén các tệp cũ và xóa các tệp cũ nhất, nhưng không có cách nào để nói quy trình mongod chuyển đổi nhật ký hiện tại ngoài việc gửi SIGUSR1.

Vì vậy, tôi đã viết

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

đến /etc/logrotate.d/mongo.

Và bây giờ có được các logfile được đặt tên tốt từ logrotate và các logfile trống mongodb.log.2013-09-18T23-49-44như dấu vết của chuyển đổi SIGUSR1. Làm thế nào để thoát khỏi cái sau?

Câu trả lời:


11

copytruncate hoạt động khá tốt cho logrotation.

một cấu hình tương tự như thế này sẽ thực hiện công việc cho bạn:

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

1
Điều này không làm việc cho tôi trên RedHat 6.5. Nhật ký đã được xoay nhưng tệp .log gốc tiếp tục phát triển mà không bị ràng buộc.
Thomas Bratt

@ThomasBratt điều này là chính xác bởi vì không khởi động lại trình xử lý tập tin mongo vẫn mở. fwics phương pháp này sẽ không hoạt động tốt tất cả.
Mxx

@ThomasBratt hãy xem câu trả lời này stackoverflow.com/a/8396266/949859
Mxx

1
@Mxx Nice find - có vẻ như copytruncate sẽ hoạt động với bước postrotate để báo hiệu cho Mongo cắt ngắn logfile
Thomas Bratt

15

Máy chủ gặp sự cố với tôi nếu bạn gửi SIGUSR1 đến mongod sau khi bạn đã di chuyển logfile ra khỏi đường đi bằng logrotate.

Cấu hình sau đây an toàn cho phiên bản tôi đã thử nghiệm - 2.6.6 trên Ubuntu 12.04 - các ví dụ trước đó đã làm sập máy chủ. Đặt cái này vào /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
}

Xem: https://jira.mongodb.org/browse/SERVER-11087 để biết thêm chi tiết và đề xuất từ ​​Akshay Kumar mà tôi đã sử dụng ở trên (sử dụng tạo thay vì nocreate và cp / dev / null cho logfile).

Trong các bản phát hành sau này, có một tùy chọn logRotate mà bạn có thể sử dụng để mở lại tệp - không đổi tên tệp - sẽ giải quyết vấn đề đổi tên - nhưng nó không hoạt động trong phiên bản của tôi (nó không được hỗ trợ).

Xem: https://github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c

Tôi đã thử nghiệm điều này với

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

Hoạt động tuyệt vời với tôi trong Mongo 2.6.11 trên CentOS 7
Tim

Tôi đã phải thay mongodb.log bằng mongod.log và nó hoạt động
cwhisperer

Có thể xác nhận rằng nếu systemLog.logRotate: reopentrong mongod.conf, thì pkill sẽ hoạt động như dự định và không cần xóa tệp nhật ký đã đổi tên vì không có tệp nào được tạo.
Julian H. Lam

15

Kể từ mongodb 3.0, bạn có thể thay đổi hành vi của mongodb bằng tham số logRotate, thay đổi trong /etc/mongod.conf

systemLog:
  logAppend: true
  logRotate: reopen

Xem thêm Hướng dẫn sử dụng Mongo .

Sau đó, bạn có thể sử dụng cấu hình logrotate này:

/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
}

Có thể sử dụng tệp PID được tạo từ tệp cấu hình .... Xem processManagement.pidFilePathtrong cài đặt PIDFile của tệp đơn vị SystemD ( /var/run/mongodb/mongod.pidđối với tôi)
Gert van den Berg

0

Sau đây làm việc cho tôi:

/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
}

Ghi chú:

  • Đã thử nghiệm trên RedHat 6.5
  • Cách duy nhất tôi có thể có được một giải pháp hoạt động là xóa các tệp nhật ký trống mà Mongo tạo ra
  • Vị trí của tệp khóa phụ thuộc vào cách MongoDB được cài đặt
  • killlà một nội dung Bash nhưng logrotate chạy bên dưới /bin/sh- không nhận ra SIGUSR1trên RedHat 6.5
  • Tôi đã không thử nghiệm compressnhưng nó sẽ là một bổ sung hoàn hảo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.