Mongodb-ログを回転させる適切な方法


13

Mongoのドキュメントでは、次のことができると言っています。

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

OSのlogrotate機能で古いファイルを圧縮して最も古いファイルを削除したいのですが、SIGUSR1を送信する以外にmongodプロセスに現在のログを切り替えるように指示する方法はありません。

だから私は書いた

/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に。

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

回答:


11

copytruncateは、ログローテーションに対して非常にうまく機能します。

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

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

1
これはRedHat 6.5では機能しませんでした。ログはローテーションされましたが、元の.logファイルは制限なく拡大し続けました。
トーマスブラット14年

@ThomasBrattこれは正しいです。なぜなら、mongoプロセスを再起動せずにファイルハンドラーが開いたままになるからです。この方法では、この方法はうまく機能しません。
Mxx 14年

@ThomasBrattはこの答えを見てくださいstackoverflow.com/a/8396266/949859
Mxx 14年

1
@Mxx素敵な検索-copytruncateは、後回転ステップで動作し、Mongoにログファイルを切り捨てるように信号を送るようです
Thomas Bratt

15

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

次の設定は、テストしたバージョン-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
}

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

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

見る: https //github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c

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

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

CentOS 7上のMongo 2.6.11で私に最適です
ティム

私はmongod.logでmongodb.logを交換しなければならなかったし、それが動作します
cwhisperer

場合ことを確認することができますsystemLog.logRotate: reopenmongod.conf、その後、pkillコマンドは、意図して何も作成されないよう名前が変更されたログファイルの一切削除が必要とされないように動作します。
ジュリアンH.ラム

15

mongodb 3.0以降、logRotateパラメーターを使用してmongodbの動作を変更できます。/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またはSystemDユニットファイルのPIDFile設定を参照してください(/var/run/mongodb/mongod.pid私用)
Gert van den Berg

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のインストール方法によって異なります
  • killBashビルトインですが、logrotateは実行されます/bin/sh-これは認識しませんSIGUSR1 6.5れ
  • 私はテストしていませんcompressが、簡単に追加できるはずです

-1

バージョン3.0以降では、単にログをローテーションするためにデータベースデーモンを強制終了する必要はありません。こちらのドキュメントを参照してください。

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


1
アンドレイはすでにそのドキュメントを読んでいるようです。あなたは本当に彼の質問に答えているわけではありません。
法律29
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.