web-dev-qa-db-ja.com

Mongodb-ログをローテーションする適切な方法

モンゴ docs 私ができると言う:

  1. -SIGUSR1シグナルを使用して、古いログの名前を変更し、現在のログを切り替えます
  2. oSからlogrotateを使用する

古いファイルをZipして最も古いものを削除するOSのlogrotate機能が欲しいのですが、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に。

そして、SIGUSR1切り替えのトレースとして、mongodb.log.2013-09-18T23-49-44のようなlogrotateおよび空のログファイルから適切な名前のログファイルを取得します。後者を取り除く方法は?

13
Andrey Regentov

copytruncateは、ログローテーションに非常に適しています。

これに似た設定はあなたのために仕事をするはずです:

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

Mongodb 3.0以降では、logRotateパラメータを使用してmongodbの動作を変更できます。/etc/mongod.confを変更します

systemLog:
  logAppend: true
  logRotate: reopen

Mongo Manuals も参照してください。

次に、この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
}
16
mmx73

Logrotateを使用してログファイルを移動した後、mongodにSIGUSR1を送信すると、サーバーがクラッシュしました。

次の構成は、私がテストしたバージョン-ubuntu 12.04の2.6.6-で安全です。前の例ではサーバーがクラッシュしました。これを/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
}

詳細:上記で使用したAkshay Kumarからの詳細と提案については、 https://jira.mongodb.org/browse/SERVER-11087 を参照してください(nocreateとcp/dev /の代わりにcreateを使用してください)ログファイルにはnull)。

それ以降のリリースでは、ファイルを再度開くために使用できるlogRotateオプションがあるはずです-名前を変更するのではなく-名前の変更の問題を回避しますが、私のバージョンでは機能しませんでした(サポートされていませんでした)。

参照: https://github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c

私はこれをテストしました

logrotate -v -f /etc/logrotate.d/mongod
15
Bill Ryder

以下は私のために働きました:

/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ビルトインですが、logrotateは/bin/shで実行されます-RedHat 6.5ではSIGUSR1を認識しません
  • 私はcompressでテストしていませんが、簡単な追加である必要があります
0
Thomas Bratt